2014-01-15 36 views
2

我有一个典型的集合持有模型的结构。骨干 - 访问集合的其他意见

在视图中,每个对象都有一个'编辑'按钮,它应该可以禁用其他对象的所有'编辑'按钮。

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

回答

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'); 
} 

如果有人有什么要补充的,或者使这种解决方案更好,我会很高兴地听到。 无论如何,希望它会对别人有帮助!

2

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

+0

不错的一个!是否可以添加到数据库中不存在的模型属性?怎么样? – guyaloni

+0

说实话,我从来没有将我的骨干模型同步到服务器。我无法对客户端模型进行映像,因此不允许拥有自己的属性。你可以有一个自定义的[sync](http://backbonejs.org/#Model-sync)方法实现,但这可能不是最漂亮的解决方案。 – rednaw

+0

也许:http://stackoverflow.com/questions/11941010/client-side-only-attributes-in-backbone – rednaw