Angular2 выберите с ngValue null

Вот что я пытаюсь сделать: я хочу, чтобы список выбора привязывался к массиву объектов с помощью ngValue, но первый параметр должен быть опцией "Нет" со значением null.

Модель:

this.managers = [
  { id: null, name: "(None)" },
  { id: 1, name: "Jeffrey" },
  { id: 2, name: "Walter" },
  { id: 3, name: "Donnie" }
  ];

this.employee = {
  name: "Maude",
  managerId: null
};

Вид:

<select [(ngModel)]="employee.managerId">
    <option *ngFor="#manager of managers" [ngValue]="manager.id">{{ manager.name }}</option>
  </select>

При загрузке список правильно привязывается к элементу "Нет". Но если вы перейдете на другой элемент и обратно, значение модели теперь переключится на строку 0: null. Это довольно неудобно; это означает, что я должен перехватить значение и изменить его на нуль вручную, прежде чем пытаться сохранить его на сервере.

Здесь Plunker с демо: http://plnkr.co/edit/BH96RWZmvbbO63ZAxgNX?p=preview

Это было довольно легко сделано в Angular 1 с дополнительным <option value="">None</option>

Кажется, что это будет довольно распространенный сценарий, и все же я не смог найти никаких решений. Я также попытался добавить <option [ngModel]="null">None</option>, но это приводит к тому же значению 0: null.

Любые предложения?

Ответ 1

Для меня это действительно похоже на ошибку, но если вы ищете быстрое решение, вы можете просто преобразовать идентификатор null в string. Он должен решить проблему, но вы должны сделать некоторые дополнительные шаги, чтобы сделать эту работу.

См. пример Пример Plnkr

Или, если вы собираетесь это сделать так, как вы указываете в ng1,  вы можете сделать следующее: Пример Plnkr

Я знаю, что это не лучшее решение, но надежда поможет вам до того, как эта ошибка будет исправлена ​​командой NG!

Ответ 2

Я перенаправляю вас на ответ TarascoMustang reddit, я реализую его решение и прекрасно работаю:

ТабаскоМустанг reddit answer

это должно работать (обновлено для текущего ng2 rc):

<select [ngModel]="audit.managerId || ''" (ngModelChange)="audit.managerId = $event">
  <option value="">Please Select</option>
  <option *ngFor="let contact of audit.contacts">{{ contact.name }}
  </option>
</select>

Ответ 3

На данный момент существует открытая проблема в репозитории github.

В качестве работы я обнаружил, что добавление ngModelChange - это самый простой способ установить значение null в представлении без необходимости добавлять что-либо к компоненту.

Вид:

<select [(ngModel)]="employee.managerId"
        (ngModelChange)="employee.managerId = $event ? $event : null">
    <option *ngFor="#manager of managers" [value]="manager.id">{{ manager.name }}</option>
</select>

обратите внимание, что ngValue теперь value

Ответ 4

Вместо строки "null" я создал пустой объект для сравнения с последним в моем TypeScript.

В компоненте:

blankObject = {
   toString() {
      return 'blank object';
   }
};

isBlank() {
    return this.filter.searchValue == null || this.filter.searchValue === this.blankObject;
}

В шаблоне:

<select [(ngModel)]="filter.searchValue">
   <option [ngValue]="blankObject"></option>
   <option *ngFor="let item of filter.selectOptions" [ngValue]="item.value">
                {{item.label}}
   </option>
</select>`

Ответ 5

Измените [ngValue] на просто [значение]