在我正在使用的应用程序模板中:
{{#if exampleModel.isDirty }}
{{else}}
{{/if}}
...根据View的模型是否为D来显示不同的Ui。这很好用。
但是我有另一个由ArrayController子类支持的视图。我想再次根据ArrayController中是否有任何脏项来更改UI。我试过了:
{{#if controller.isDirty }}
和
{{#if controller.content.isDirty }}
但是虽然它们都没有生成异常,但在任何时候都不会评估为true,即使ArrayController子类中的Models是脏的。
检查ArrayController修饰的任何模型是否脏的正确方法是什么?
答案 0 :(得分:3)
我猜你可以在ArrayController上定义一个计算属性:
isDirty : function(){
this.forEach(function(model){
var dirty = false;
if(model.get("isDirty"))
dirty = true;
});
return dirty;
}.property("content.@each.isDirty")
所以关键是属性依赖的正确声明。
更新到评论中的有趣问题:为什么这个功能没有融入Ember?
关于您对功能性的评论:您正在考虑使用余烬数据的Ember。我个人不会将它与ember-data一起使用。所以在我的情况下,这个功能将是无稽之谈。因此,可以讨论将其作为Mixin添加到Ember中,以便更好地集成。
示例:
Ember.IsArrayDirtyMixin = Ember.Mixin.create({
isDirty : function(){
this.forEach(function(model){
var dirty = false;
if(model.get("isDirty"))
dirty = true;
});
return dirty;
}.property("content.@each.isDirty")
});
App.YourController = Ember.ArrayController.extend(Ember.IsArrayDirtyMixin,{
.... // your stuff
});
// shorter version proposed by pjlammertyn in the comments
Ember.IsArrayDirtyMixin = Ember.Mixin.create({
isDirty : function(){
return !this.every(function (model) { return !model.get('isDirty'); });
}.property("content.@each.isDirty")
});
答案 1 :(得分:0)
或者更简单地说,假设你在ArrayController
:
...
hasChanged: function() {
var records = this.get('model');
return records.isAny('isDirty', true);
}.property('model.@each.isDirty'),
isNotDirty: Ember.computed.not('hasChanged'),
...
真的这些模式非常普遍,我很惊讶他们没有内置。