2017-01-16 3 views
1

Я пытаюсь отобразить список Contact с в списке:Angular2: Ошибка привязка наблюдаемую массива компонент

<h1>Contacts</h1> 
<ul> 
    <li *ngFor="let contact of contacts$ | async"> 
     <ul> 
      <h1>Name: {{contact.name}}</h1> 
      <li>ObjectID: {{contact._id}}</li> 
      <li>LastName: {{contact.lastName}}</li> 
      <li>FirstName: {{contact.firstName}}</li> 
      <li>Email: {{contact.email}}</li> 
      <li>Notes: 
       <ul *ngFor="let note of contact.notes"> 
        <li>{{note}}</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

contacts$ является Observable<Array<Object>>:

@Component({ 
    selector: 'contacts-list', 
    templateUrl: 'list.component.html' 
}) 
export class ContactsListComponent implements OnInit { 
    contacts$: Observable<Array<Object>>; 


    constructor(private logger: LoggerService, 
       private router: Router, 
       private trackerService: TrackerService) { 
     this.logger.debug(`ContactListComponent.ctor`); 
    } 

    ngOnInit() { 
     this.contacts$ = this.trackerService.cache('tracker/contacts'); 
    } 
} 

В настоящем время, TrackerService.cache(...) является просто создавая Observable из жесткого набора для тестирования:

public cache(path: string): Observable<Array<Object>> { 
    let retval = [new Object({ 
     _id: '123abc', 
     lastName: 'last', 
     firstName: 'first', 
     email: '[email protected]', 
     notes: ['note 1', 'note 2'] 
    }), new Object({ 
     _id: '123abc', 
     lastName: 'last', 
     firstName: 'first', 
     email: '[email protected]', 
     notes: ['note 1', 'note 2'] 
    })]; 
    return Observable.from(retval) 
     .map((v) => { 
      this.logger.debug(`Mapping value: ${JSON.stringify(v)}`); 
      return v; 
     }); 
} 

Операция .map() только для тестирования, и я вижу это в хромированной консоли:

debug DEBUG: Mapping value: {"_id":"123abc","lastName":"last","firstName":"first","email":"[email protected]","notes":["note 1","note 2"]} 

Однако, когда я запускаю это, я получаю:

Error: Error in ./ContactsListComponent class ContactsListComponent - inline template:2:8 caused by: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

Я прочитал другие SO threads, angular.io и моей ng2-book, которая имеет похожие примеры, но я просто не понимаю этого.

Что я делаю неправильно?

+0

так что вы получаете данные о желании в консоли? – micronyks

+0

this.contacts $ .subscribe (value => this.contact = value); после this.contacts $ = this.trackerService.cache ('tracker/contacts'); и в * ngДля замены контактов $ | асинхронный контакт. объявить контакт: любой. вам нужно подписаться на наблюдаемые –

+0

@AmitSuhag: Я думал, что асинхронная трубка обработала подписку для меня? Разве это не все точки асинхронной трубы? –

ответ

1

Observable.from будет излучать каждый элемент массива.

Использовать Observable.of для испускания всего массив.

+0

В этом была проблема. Комментарий @micronyks привел меня к решению, и я только собирался опубликовать ответ. –

+0

Я думаю, что возникает вопрос, однако. В моем исходном коде, где я использовал 'from', моя функция' .map() 'была удалена только один раз, для одного элемента массива. Если 'from' испускает каждый элемент массива, почему я только вижу его в своем отладочном выходе? –

+0

Хм, это действительно странно. Вы должны увидеть два журнала. Возможность состоит в том, что, поскольку ваши два объекта равны, генерируемый журнал одинаковый. В этом случае хром-консоль просто печатает журнал один раз, но добавляет счет слева от печатного журнала. В вашем случае вы можете увидеть что-то вроде '(2) Сопоставление значения ....' – Melou

Смежные вопросы