1

通常我发现我自己需要编写一个具有特定功能的对象,它是一组模型。

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

我认为最好给你一个例子:

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

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 集合吗?

先感谢您。

4

1 回答 1

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

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

于 2013-10-01T12:41:03.160 回答