2016-09-22 7 views
2

Я пытаюсь Угловая 2, и мне грозит странная проблема, которую я не понимаю.Угловое 2 ngFor первое вхождение не определено

я сделать простой список задач, и когда я исполняю мое приложение у меня есть сообщение об ошибке:

Error message from Chrome console

Я не понимаю, почему первое вхождение итерация не определено. Мой массив жестко запрограммирован, поэтому я не понимаю, почему возникает эта проблема. Вот код для этого приложения:

app.module.ts

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { TodoNavComponent } from './app.todo-nav'; 
import { TodoListComponent } from './app.todo-list'; 
import { TodoComponent } from './app.todo'; 

@NgModule({ 
    imports:  [ BrowserModule ], 
    declarations: [ TodoNavComponent, TodoListComponent, TodoComponent ], 
    bootstrap: [ TodoNavComponent, TodoListComponent, TodoComponent ] 
}) 
export class AppModule { } 

app.todo-list.ts

import { Component } from "@angular/core"; 
import { TodoService } from "./app.service"; 

@Component({ 
    selector: "todo-list", 
    template: ` 
     <div class="container"> 
      <ul class="list-group"> 
       <todo *ngFor="let todo of todos" [todo]="todo"></todo> 
      </ul> 
     </div>`, 
    providers: [TodoService] 
}) 
export class TodoListComponent { 
    todos: any[] = [ 
     { name: "Do shopping", done: false }, 
     { name: "Get some gaz for my car", done: true }, 
     { name: "Download last season of Game of Thrones", done: false } 
    ]; 

    constructor(private service: TodoService) { 
     service.todoAdded$.subscribe(
      todo => { 
       this.todos.push(todo); 
      } 
     ); 
     service.todoRemoved$.subscribe(
      todo => { 
       this.todos = this.todos.filter(
        (value, index, array) => { 
         return todo.name !== value.name; 
        } 
       ); 
      } 
     ); 
    } 
} 

app.todo.ts

import { Component, OnDestroy, Input } from "@angular/core"; 
import { TodoService } from "./app.service"; 
import { Subscription } from 'rxjs/Subscription'; 

@Component({ 
    selector: "todo", 
    template: ` 
     <li class="list-group-item"> 
      <i class="pull-right glyphicon glyphicon-remove" (click)="remove()"></i> 
      {{todo.name}} 
     </li>`, 
    providers: [TodoService] 
}) 
export class TodoComponent implements OnDestroy { 
    @Input() todo; 
    subscription: Subscription; 

    constructor(private service: TodoService){ 
     this.subscription = service.todoAdded$.subscribe(
      todo => { 
       this.todo = todo; 
      } 
     ); 
    } 

    remove() { 
     this.service.removeTodo(this.todo); 
    } 

    ngOnDestroy() { 
     this.subscription.unsubscribe(); 
    } 
} 

Рецензия:

Rendering result

Что я пропустил? Я не понимаю, почему это происходит только для первых событий, а не для других.

Спасибо!

+0

Это исправление для этой ошибки здесь объяснены: Http: // StackOverflow.com/questions/40291111/angular-2-first-item-in-array-missing-using-ngfor –

ответ

0
  1. Вы должны включить TodoService в поставщиков NgModule. Если вы вводите TodoService внутри TodoComponent и TodoListComponent, они оба получат свою собственную копию сервиса. Это означает, что если вы добавите что-то в TodoService внутри TodoComponent, он не будет отображаться внутри службы, введенной в TodoListComponent.

  2. Вы должны перенести подписку на сервисы от конструктора на крючок OnInit. Конструкторы должны быть тощими. Вот что говорят Угловые 2 документы:

Мы не получить данные в компоненте конструктора. Зачем? Потому что опытные разработчики согласны с тем, что компоненты должны быть дешевыми и безопасными для построения. Мы не должны беспокоиться о том, что новый компонент попытается связаться с удаленным сервером при его создании под тестированием или до того, как мы решим его отобразить. Конструкторы должны делать не более, чем устанавливать начальные локальные переменные в простые значения.

Когда компонент должен начать работать вскоре после создания, мы можем рассчитывать на Угловое, чтобы вызвать метод ngOnInit, чтобы запустить его. В этом и заключается тяжелая логика инициализации.

Помните также, что свойства входных данных, привязанные к директиве, не задаются до завершения. Это проблема, если нам нужно инициализировать директиву, основанную на этих свойствах. Они будут установлены, когда будет запущен наш ngOninit.

+0

Хорошо, для обслуживания, используя только я следую документации, теперь я использую OnInit, но это не решает проблему неопределенная проблема на первой итерации. Когда я подписываюсь на мою службу в конструкторе, я нашел его, потому что служба передавала мне через параметр конструктора, где я могу найти эту услугу? – MrGrabazu

0

Объект .name поможет U, если и хотят, чтобы петля

+0

Это просто создает больше ошибок. Я просто хочу понять, почему первый элемент жестко заданного массива неправильно инициализирован директивой цикла. – MrGrabazu

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