Backbone - 访问集合的其他视图

时间:2014-01-15 14:48:41

标签: backbone.js backbone-views backbone-events

我有一个典型的集合模型结构。

在视图中,每个对象都有一个“编辑”按钮,该按钮应该停用其他对象的所有“编辑”按钮。

我想知道这样做的最佳做法是什么。谢谢!!

2 个答案:

答案 0 :(得分:2)

您可以在模型上添加属性editable,默认设置为true。然后,当您单击其中一个视图上的“编辑”按钮时,您可以遍历其他视图的所有模型,并将editable设置为false。在视图上,您​​将听取模型更改,并重新呈现视图。如果editablefalse,您将停用修改按钮。

答案 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:falseedidable: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');
}

如果有人要添加某些东西或者让这个解决方案更好,我会很高兴听到。 无论如何,希望它对别人有所帮助!!