我想在我的视图中订阅模型的 becomeInvalid 和 becomeError 事件,以便我可以设置一些错误状态。我可以想到两种方法,各有各的缺点。
我能想到的第一种方法是使用观察者在视图上创建我自己的 becomeInvalid 和 becomeError 挂钩:
becameInvalid: function() {
var isValid = this.get('controller.model.isValid');
if (Ember.isNone(isValid) || isValid) {
return;
}
console.log('becameInvalid');
}.observes('controller.model.isValid')
becameError: function() {
var isError = this.get('controller.model.isError');
if (Ember.isNone(isError) || !isError) {
return;
}
console.log('becameError');
}.observes('controller.model.isError')
这可行,但使用了很多样板代码。我能想到的第二种方法是在加载模型后向事件添加处理程序:
didLoad: function() {
var isLoaded = this.get('controller.model.isLoaded');
if (Ember.isNone(isLoaded) || !isLoaded) {
return;
}
var model = this.get('controller.model');
model.on('becameInvalid', function() {
console.log('becameInvalid');
});
model.on('becameError', function() {
console.log('becameError');
});
}.observes('controller.model.isLoaded')
这种方法的问题是它仍然需要一些样板代码,并且(如果我错了,请纠正我)当视图被删除时,事件处理程序不会被自动清理。
我想做的是类似于观察者协议的事件,这些事件将由框架自动清理。例如:
becameInvalid: function() {
console.log('becameInvalid');
}.eventHandler('controller.model.becameInvalid')
becameError: function() {
console.log('becameError');
}.eventHandler('controller.model.becameError')
这样的事情存在吗?