我有一个自定义选择组件,它在您点击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