@rinatoptimus

Почему не работает ngModel вне цикла ngFor?

Angular 2.
Идея в данном примере такая: изначально видны все задания (tasks). Нажимая чекбокс, можно отобразить либо только Дневное, либо только Ночное. Это ожидаемый результат.
Пока до ожидаемого результата не дошел, тк надо сперва вынести чекбокс из цикла, чтобы он находился не внутри блока ngFor.
Такой вариант (когда чекбокс находится внутри ngFor) работает:

<div  *ngFor="let task of tasks">
      <div class="col-md-3">
        <label class="btn-custom">
          <input type="checkbox" autocomplete="off" 
               [(ngModel)]="task.taskType" (ngModelChange)="onModelChange(task);">
        </label>
        <p>{{task.val}}</p>
      </div>
    </div>


А такой нет:

<label class="btn-custom">
    <input type="checkbox" autocomplete="off" [(ngModel)]="task.taskType" (ngModelChange)="onModelChange(task);">
</label>

<div  *ngFor="let task of tasks">
      <div class="col-md-3">
        <p>{{task.val}}</p>
      </div>
</div>


Вот весь файл:

@Component({
  selector: 'my-app',
  template: `
    <div  *ngFor="let task of tasks">
      <div class="col-md-3">
        <label class="btn-custom">
          <input type="checkbox" autocomplete="off" 
               [(ngModel)]="task.taskType" (ngModelChange)="onModelChange(task);">
        </label>
        <p>{{task.val}}</p>
      </div>
    </div>

    <div>selected: {{getCheckedValues() | json}}</div>
  `,
})
export class App {
  
  tasks = [
    {chkBoxImageUrl: "http://placehold.it/160x100",id: "item-1",val: "1", taskType: true},
    {chkBoxImageUrl: "http://placehold.it/160x100", id: "item-2", val: "2", taskType: false},
    {chkBoxImageUrl: "http://placehold.it/160x100", id: "item-3", val: "3", taskType: true},
    {chkBoxImageUrl: "http://placehold.it/160x100", id: "item-4", val: "4", taskType: false}
  ];

  getCheckedValues() {
    //return this.tasks.filter(obj => obj.checked).map(obj => obj.val);
    //return this.tasks.filter(obj => obj).map(obj => obj.val);
    return this.tasks.filter(obj => obj.taskType).map(obj => obj.val);
  }
}

@NgModule({
  imports: [ BrowserModule, FormsModule],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}


Plunkr.
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
Потому что у вас task доступен только внутри эл-та c ngFor
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы