我有一个典型的集合模型结构。
在视图中,每个对象都有一个“编辑”按钮,该按钮应该停用其他对象的所有“编辑”按钮。
我想知道这样做的最佳做法是什么。谢谢!!
答案 0 :(得分:2)
您可以在模型上添加属性editable
,默认设置为true
。然后,当您单击其中一个视图上的“编辑”按钮时,您可以遍历其他视图的所有模型,并将editable
设置为false
。在视图上,您将听取模型更改,并重新呈现视图。如果editable
为false
,您将停用修改按钮。
答案 1 :(得分:1)
好的,所以我提出了以下方法:
假设该模型具有属性status
,并且当它被修改为active
时,我想隐藏其他条目中的编辑按钮(或者只是禁用它)。
我的集合视图侦听模型中的更改:
initialize: function(){
this.listenTo(this.collection, "change:status", this.triggerEditable);
},
监听器回调看起来像:
triggerEditable: function(obj){
var triggerValue = null;
// I am interested in a status which became 'active' or stopped being 'active'
if (obj.get("status") == 'active' && obj.previous("status") != 'active') {
triggerValue = "editable:false";
} else if (obj.get("status") != 'active' && obj.previous("status") == 'active') {
triggerValue = "editable:true";
}
// for any other status change - return
if (!triggerValue) return;
// trigger is fired for all other objects in the collection
_.each(obj.collection.without(obj),function(otherObj) {
otherObj.trigger(triggerValue);
});
}
因此,当一个对象变为活动状态或停止活动时,将为所有其他条目触发edidable:false
或edidable:true
。我需要做的就是向模型视图初始化器添加一个监听器:
this.listenTo(this.model, "editable:false", this.disableEdit);
this.listenTo(this.model, "editable:true", this.enableEdit);
在这里,我想我可以将这两行合并为一,首先通过监听editable
命名空间(如何?? ),然后通过将参数传递给函数(再次,怎么样?)。
从这里开始直接 - 实现监听器回调:
disableEdit: function() {
var e = this.$el.find('button.edit')
e.attr('disabled','disabled');
}
如果有人要添加某些东西或者让这个解决方案更好,我会很高兴听到。 无论如何,希望它对别人有所帮助!!