2013-10-01 30 views
1

通常我发现自己需要编写一个具有特定功能的对象,它是一组模型。使用自定义方法扩展Backbone集合以添加逻辑是一种不好的做法吗?

最后,我扩展了一个集合并添加了更多可与其模型配合使用的函数。

我认为是更好的展现你一个例子:

我的应用程序有一组权限,与用户和/或平台的版本有关。

var Permissions = Backbone.Collection.extend({ 
    model: Permission, 

    hasAccess: function (moduleCode) { 
     .... 
    }, 

    allowAccess: function (moduleCode) { 
     .... 
    }, 

    ... 

用这种方法我改变了权限(模型)的属性的格式。 (我的权限是代码与字符串的连接,用于标识许可类型。)

一位同事告诉我这是错误的。在.NET中,他创建了一个类,并添加了一个私有列表并对其进行更改。他不会继承列表并进行更改。

他会做一个模型,它里面他会补充一个集合属性

this.set("permissionsCollection", new Backbone.Collection.extend({model: Permission}))

[评论:我不明白为什么他创造一切的性质,我认为对他来说是不需要。] - >但这是另一个问题

我认为用不同的方式。我知道该集合内部有该列表。我在Backbone.Collections中有很强的潜力,为什么我必须使用一个没有必要的模型?如果我不需要封装......我认为这是没有必要的,他对我的观点是过度的。

我错了吗?我不知道如何使用BackboneJS集合?

预先感谢您。

回答

1

在开始的时候我有什么用类似的方法被称为helper

 findAttr: function (model, name) { 
      var attrs = model.get('app_attrs'); 
      if (attrs !== undefined) { 
       return this.findByAttrName(attrs, name); 
      } 
     }, 
     findByAttrName: function (array, name) { 
      return _.find(array, function(a) { 
       if (a.attrName === name) { 
        return a; 
       } 
      }); 
     } 

视图代码更为尴尬:

 render: function() { 
      var attr = helper.findAttr(this.model, 'user'); 
      ... 
      return this; 
     } 

唯一合乎逻辑的解决办法是这些方法进入模型(在上述情况下为this.model)。重构后,我得到:

 render: function() { 
      var attr = this.model.findAttr('user'); 
      ... 
      return this; 
     } 

这当然比以前的解决方案更具可读性。

+0

我明白了。我也一直这样做。我的模型非常自定义。当几个模型有共同的方法,但不是所有的模型,我创建一个我将扩展的超级模型,或者我创建新的属性(包含其他模型,集合...,默认外部)。我也非常喜欢可读性,更容易理解,所以它更易于维护。那么你认为可以为自定义集合添加更多功能吗? – ccsakuweb

+1

当然,虽然那些处理你的集合数据的方法(比如上面的例子),但我认为可以用这种方式对它们进行分组。 –

相关问题