ОБНОВЛЕНИЕ Я поставил return
после журнала консоли и определил, что проблема не в Обещании — он читается нормально. В строке, которую я выделяю в приведенном ниже коде, this.contentItems = cpl.ary as ContentItem[];
возникает ошибка. Я проверил, что cpl
— это объект с одним свойством, ary
, которое представляет собой массив из 4 элементов. В журнале консоли отображается нормально. Но когда я пытаюсь получить свойство ary
as ContentItem[]
, он выдает null
и пытается присвоить его моему пустому Content[]
слева. Так что это чисто кастинг или другая проблема назначения типа. Я изменю тему этого вопроса, как только найду ответ.
Моя проблема в том, что this.contentItems
получает значение null в методах then
в content-display.component.ts.
JSON, который я использую, таков:
{ "ary":[
{
"id": "1",
"name": "Test Project",
"nextDate": "2016-12-01T16:00:00",
"dateDescription": "ends",
"contentType": "project",
"link": "http://google.com",
"topics": ["1"]
},
{
"id": "3",
"name": "Dummy Article",
"nextDate": "2016-12-21T00:00:00",
"dateDescription": "expires",
"contentType": "article",
"link": "http://msn.com",
"topics": ["2"]
}
]}
В моем контенте item.service.ts:
getContentItems(): Promise<ContentPayload> {
if( window.location.hostname === "localhost" )
return Promise.resolve( CONTENTITEMS );
else
return this.http.get( this.contentUrl )
.toPromise()
.then( (response) => { return response.json() } )
.then( (data) => { return data as ContentPayload })
.catch( this.handleError );
}
И обратно в мой контент-display.component.ts
private contentItems: ContentItem[] = [];
getContentItems(): void {
this.contentItemService.getContentItems()
.then( (contentPayload) => this.getArrayFromPayload )
.then( this.getSelectOptions );
}
getArrayFromPayload( cpl: ContentPayload ): void {
this.contentItems = cpl["ary"];
/********** above, this.contentItems is set to null ************/
this.filteredItems = this.contentItems;
}
КонтентПолезная нагрузка:
export class ContentPayload {
ary: any[];
}
КонтентЭлемент:
export class ContentItem {
id: string;
name: string;
nextDate: Date;
dateDescription: string;
contentType: string;
link: string;
isClicked?: boolean = false;
topics: string[];
}
Этот включен для полноты. Что он делает не важно, ошибка возникает выше.
getSelectOptions( ): void {
// return TOPICMAP;
var topicMap: Topic[] = TOPICMAP;
var filteredTopicMap: Topic[] = [];
var uniqueValues: string[] = this.makeContentSet( this.getTopicIDs( this.contentItems ) );
for( var i = 0; i < uniqueValues.length; i++ ) {
filteredTopicMap.push( this.getTopicWithID( topicMap, uniqueValues[i] ) );
}
this.selectOptions = filteredTopicMap;
}
И мой шаблон для этого компонента (несоответствия в стиле и использовании «этого» со временем будут устранены. А вы знали, что на iPad нет обратных галочек?):
template: `
<h2>{{title}}</h2>
<div>Maximum of 20 items</div>
<div>Order:
<span [class.clicked]="latestOldest==='latest'" (click)="mySort('latest')">latest first</span>
|
<span [class.clicked]="latestOldest==='oldest'" (click)="mySort('oldest');">oldest first</span>
</div>
<div>
Filters:
<ng-select
[options] = "this.selectOptions"
[multiple] = "this.showMultiple"
placeholder = "Select topics"
[allowClear] = "true"
theme = "default"
(selected) = "onSelected( $event )"
(deselected) = "onDeselected( $event )">
</ng-select>
<ul>
<li *ngFor="let contentItem of filteredItems"
(click)="onClick(contentItem)"
class="{{contentItem.contentType}}"
[class.clicked]="contentItem.isClicked">
<h3>{{contentItem.name}}</h3>
<div>{{ contentItem.contentType | uppercase }} {{ contentItem.dateDescription}}
{{ contentItem.nextDate.toGMTString() | date:'mediumDate' }}
{{ (contentItem.contentType !== "article")? (contentItem.nextDate | date:'shortTime'): '' }}
</div>
</li>
</ul>
</div>
`
</div>
для вашего открытого div в строке 9 - person bassxzero   schedule 24.10.2016cpl
отображается как объект JSON, ноcpl.ary
не находит массивContentItem[]
. Консоль, однако, показывает, что это значение [Object, Object, Object, Object], что должно быть правильным. - person Colin Mac   schedule 24.10.2016return data as ContentPayload
делает то, что вы хотите. Попробуйте явно создать и настроить свойстваContentPayLoad
вместо того, чтобы пытаться преобразовать объект JSON. - person bassxzero   schedule 24.10.2016this
в функции, которая вызывалась в промисеthen
, не была эквивалентна компоненту. Не уверен, что это означало, но что-то другое. Поэтому я изменил.then( (contentPayload) => this.getArrayFromPayload )
, который присваивал this.contentItems внутри этой функции, на.then((contentPayload)=>this.contentItems = this.getArrayFromPayload)
, и это сработало. - person Colin Mac   schedule 24.10.2016