2013-03-20 8 views
6

Praca z bryzą wspieraną przez SharePoint, zgodnie z opisem here i używanie TypeScript zamiast JS.Dlaczego elementAspect z moich elementów zapytania miałby wartość NULL?

W klasie DataService utworzyć EntityManager i wykonać zapytanie:

private servicePath: string = '/api/PATH/'; 
private manager: breeze.EntityManager; 

constructor() { 
    this.init(); 
} 

private init(): void { 
    this.manager = new breeze.EntityManager(this.servicePath); 
} 

public ListResponses(): breeze.Promise { 
    var query = breeze.EntityQuery.from("Responses"); 
    return this.manager.executeQuery(query); 
} 

Następnie nazwać to z moim modelu widoku, który działa prawidłowo:

private loadResponses(): void { 
    this.dataservice.ListResponses().then((data) => { 
     this.handleResponsesLoaded(data); 
    }).fail((error) => { 
     this.handleDataError(error); 
    }); 
} 

private handleResponsesLoaded(data:any): void { 
    for (var i = 0; i < results.length; i++){ 
     this.extendItem(results[i]); 
    } 
    this.renderList(results, "#tp-responses-list"); 
} 

ale moje próby rozszerzenia każdego pozycja kończy się niepowodzeniem, ponieważ pozycja elementu entityAspect jest pusta:

private extendItem(item: any): void { 
    item.entityAspect.propertyChanged.subscribe(() => { // FAILS HERE 
     setTimeout(() => { 
      if (item.entityAspect.entityState.isModified()) { 
       this.dataservice.SaveChanges().then((result) => { 
        tracer.Trace("SaveChanged Result: " + result); 
       }).fail((error) => { 
        this.handleDataError(error); 
       }); 
      } 
     }, 0); 
    }); 
} 

Po nspecting element wynik, widzę to po prostu zwykły obiekt danych, ze wszystkimi właściwościami spodziewałbym ale nie Podmiot dobroć:

enter image description here

Właśnie rozpoczął wietrze, więc najlepszym sposobem, aby umieścić pytanie brzmi: co ja tu zrobiłem źle?

Odpowiedz

5

Jeśli Breeze nie może znaleźć odpowiedniego typu w swoich metadanych do tego, co otrzymuje w wyniku zapytania, po prostu zwraca "surowy" obiekt Json.

Dlatego, że metadane nie jest dostępny to zazwyczaj ze względu na jeden z dwóch wyjaśnień:

1) nie są szeregowania typu informacje w odpowiedzi na kwerendę. Atrybut [BreezeController] lub Atrybuty [BreezeJsonFormatter] spełniają to.

2) Samo zapytanie nie zwraca typów, dla których opisano metadane. Możesz w tym przypadku utworzyć metadane bezpośrednio na kliencie lub zwrócić je z serwera za pomocą metody "Metadanych". (patrz przykład NoDb w pakiecie Zip Breeze na przykład pierwszego).

Możesz również spojrzeć na JsonResultsAdapter, jeśli chcesz przekonać dowolny wynik zapytania do "znanego" typu metadanych, ale zazwyczaj nie jest to konieczne, jeśli używasz atrybutu [BreezeController].

Mam nadzieję, że to pomoże.

+0

Jay - Dziękuję za szybką odpowiedź. Używam metadanych wyodrębnionych z edmx referencji do usługi, ale musi w tym być coś złego - spróbuję to naprawić (mam wiele typów encji i nie chcę ręcznie stosować metadanych w klienta, jeśli mogę pomóc). W związku z tym krótka kontynuacja: w jaki sposób typ breeze pasuje do metadanych? Czy jest to oparte na nazwie typu lub na mapie właściwości, takich jak interfejs lub ...? – JcFx

+0

można uzyskać listę typów, które zawiera metadataStore za pomocą metody getEntityTypes. Każdy typ jednostki ma "nazwę" i właściwość "shortName", które można dopasować. –

+0

Spoglądam na to rano. Dzięki jeszcze raz. – JcFx

2

Poniższa odpowiedź nie jest moja, ale OP. Został opublikowany w samym pytaniu, podczas gdy powinien mieć odpowiedź.


Problemem było niedopasowanie przestrzeni nazw. Wyodrębniam metadane z edmx generowanego przez odwołanie do usługi Visual Studio. Ten edmx używa przestrzeni nazw wywoływanej usługi. Moje obiekty proxy znajdują się w innym obszarze nazw. Wyszukiwanie jednostki Breeze (nawet przy użyciu krótkiej nazwy) jest w formacie Type # Namespace, więc nie miałem żadnych dopasowań. Poprawiłem moją niestandardową metodę BuildJsonMetadata na serwerze, aby zamienić przestrzenie nazw i teraz mam poprawnie udekorowane obiekty, które działają poprawnie.

Powiązane problemy