2016-07-21 2 views
3

У меня есть <select>, который пользователь может изменить. Первоначально он имеет значение, и когда пользователь меняет его, я должен запросить ее "are you sure"?, и в случае, если ответ НЕТ, измените значение <select> на предыдущее. <select> привязан к коллекции объектов, а не значений.Angular2 - сбросить значение выбора после изменения пользователем

Лучшее, что я мог придумать до сих пор это:

  • в HTML
<select [ngModel]="selectedObj" (ngModelChange)="onSelectedObjChanged($event)"> 
    <option *ngFor="let obj of availableObjs" [ngValue]="obj">{{whatever}}<option> 
</select> 
  • в коде
onSelectedObjChanged(obj) { 
    if (prompt answer is no) { 
    let currentlySelectedObj = this.selectedObj; 
    this.selectedObj = null; 
    this.changeDetectorRef.detectChanges(); 
    this.selectedObj = currentlySelectedObj; 
    this.changeDetectorRef.detectChanges(); 
    } 
} 

Это работает, но уродливо. Почему я это делаю:

  • , кажется, нет никакого способа, чтобы отменить выбор событие изменения в DOM
  • когда onSelectedObjChanged называется и ответ «нет», мне нужно как-то пусть Угловая знать это должен обновить целевую привязку, то есть <select> ...
  • ... однако я не могу просто установить this.selectedObj = this.selectedObj, поскольку значение не изменяется, и никаких изменений не обнаружено угловыми; Вот почему я поставил его в null и обратно ...
  • ... Но даже этого недостаточно, мне нужно, чтобы вызвать changeDetectorRef.detectChanges() уведомить Угловая его

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

Спасибо!

+0

'ngModel' не должен быть записан таким образом =>' [(ngModel)] ' ? – developer033

+0

Он может, но тогда вы не будете уведомлены о том, когда значение изменится, чтобы вы могли запросить пользователя. '[(ngModel)]' расширяется до '[ngModel] = x (ngModelChange) = y' –

ответ

0

Я использую $event.target.value вместо $ event. Я отправляю this.selectedObj = $event.target.value; и if failed изменение this.selectedObj = previousObject Мне не нужны какие-либо обнаружение изменений.

+0

Я подозреваю, что вы используете простые значения, а не список o связанных объектов? Кроме того, где вы сохраняете 'previousObject'? –

+0

Я использую '' , где ActionList является строкой Array.Я установил по умолчанию this.selectedObject = this.previousObject из actionList, и если функция myAction() возвращает значение false, я снова устанавливаю this.selectedObject. –

-1

попробуйте this.selectedObj = obj.target.value;, а не выполните ваше состояние.

+0

Я привязываюсь к списку объектов и использую 'ngValue', поэтому 'obj.target.value' будет неопределенным. –

2

Вот как я это сделал:

HTML:

<select [(ngModel)]="option" 
     #selectModel="ngModel" 
     (ngModelChange)="optionChanged($event)"> 
    <option [ngValue]="null">PlaceHolder</option> 
    <option *ngFor="let o of options" [ngValue]="o">...</option> 
</select> 

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

@ViewChild('selectModel') private selectModel: NgModel; 

optionChanged($event) { 
    //logic 
    this.selectModel.reset(null); 
} 
Смежные вопросы