我有一個自定義選擇組件,它在您點擊li
項目時設置模型,但由於我每次更改模型時都手動調用this.modelChange.next(this.model)
,所以我很想避免這種混亂和可重複的操作。如何在每次模型角度2變化時調用函數?
所以我的問題是,如果有類似$scope.$watch
的東西,我可以觀察一個值是否發生變化,然後每次發生時調用this.modelChange.next(this.model)
。
我一直在閱讀關於Observables
,但我無法弄清楚這應該如何用於一個簡單的值,因爲我看到的所有示例都與外部api:s的異步請求。
當然,必須有一個更簡單的方法來實現這一目標?
(不是說我不能使用ngModelChanges
,因爲我實際上沒有使用輸入)。
import {Component, Input, Output, EventEmitter, OnInit, OnChanges} from 'angular2/core';
@Component({
selector: 'form-select',
templateUrl: './app/assets/scripts/modules/form-controls/form-select/form-select.component.html',
styleUrls: ['./app/assets/scripts/modules/form-controls/form-select/form-select.component.css'],
inputs: [
'options',
'callback',
'model',
'label'
]
})
export class FormSelectComponent implements OnInit, OnChanges {
@Input() model: any;
@Output() modelChange: EventEmitter = new EventEmitter();
public isOpen: boolean = false;
ngOnInit() {
if (!this.model) {
this.model = {};
}
for (var option of this.options) {
if (option.model == (this.model.model || this.model)) {
this.model = option;
}
}
}
ngOnChanges(changes: {[model: any]: SimpleChange}) {
console.log(changes);
this.modelChange.next(changes['model'].currentValue);
}
toggle() {
this.isOpen = !this.isOpen;
}
close() {
this.isOpen = false;
}
select(option, callback) {
this.model = option;
this.close();
callback ? callback() : false;
}
isSelected(option) {
return option.model === this.model.model;
}
}
編輯:我嘗試使用ngOnChanges
(見上更新的代碼),但它只能在初始化運行一次,然後在沒有檢測的變化。有什麼不對?
Set/get不起作用它只是拋出一大堆錯誤,ngOnChanges不起作用,因爲我改變了組件內部的值,然後用兩種方式將它綁定到父組件。 ngDoCheck()似乎是過度殺傷,因爲我只需要知道它是否發生了變化,我不需要任何特定的邏輯。我真正喜歡的是使用觀察者,但我正在爲如何實施而失去理智。你能告訴我如何與觀察員達成這個目標嗎?使用我的代碼,不是一些與我的用例完全不同的隨機示例。我會很感激它像瘋了一樣。 – Chrillewoodz
關於ngDoCheck(),Angular不能神奇地知道我們的ReferenceTypes的結構,所以如果我們必須爲他們編寫我們自己的變化檢測邏輯,這並不過分。 (這在我引用的生命週期文檔中討論過。)由於'model'是一個輸入屬性,我將使用ngDoCheck()而不是observable。你有一個簡單的蹦牀,只是演示非工作片? –
「由於model是一個輸入屬性,所以我會使用ngDoCheck()而不是observable。」爲什麼是這樣?你應該爲http請求以外的其他應用程序使用observables嗎?通過檢查以前的模型,我得到它與doCheck一起工作,或者它最終成爲一個無限循環。 – Chrillewoodz