【问题标题】:Can I add attributes to a Backbone View?我可以向主干视图添加属性吗?
【发布时间】:2012-10-04 09:18:37
【问题描述】:

我一直在使用骨干网,现在我正在使用许多视图。在我的某些观点中,我有时会添加自定义属性,例如:

    var DataGrid = Backbone.View.extend({
        className:"datagrid",
        lookup: {
            header: "", //Header wrapper row element
            headers: [], //Views in header
            body: "", //Body wrapper row element
            rows: [] //Views in body
        },

        events: {
            ...
        },

        initialize: function() {
            ...
        },

        render: function() {
            ...
        }
    });

如您所见,我将“查找”作为对象的额外属性。我在许多视图中使用 DataGrid,我遇到了一种非常奇怪的行为。当我在使用 DataGrid 的视图之间切换时,“查找”仍将填充旧数据。我在创建新 DataGrid 时使用“new”,但我仍然找到旧数据。我错过了什么吗?

编辑:关注@rabs 回复。我在 Backbone 中搜索了静态变量,发现:Simplify using static class properties in Backbone.js with Coffeescript

【问题讨论】:

  • initialize 函数中将您的自定义属性添加到this

标签: object backbone.js backbone-views


【解决方案1】:

我知道这个答案已经被接受(不久前),但是当我最近在从事骨干项目时遇到这个问题时,我认为值得一提的是,您也可以将属性定义为函数。这对于需要将属性设置为当前模型中的值的视图特别有用。

通过将属性定义为函数,您可以执行类似的操作

var myObject = Backbone.View.extends({
    attributes: function() {
        if(this.model) {
            return {
                value: this.model.get('age')
            }
        }
        return {}
    }
}); 

希望对某人有所帮助

【讨论】:

  • 我不确定模型是否应该包含视图特定数据。至少将它们分开以便可重用(模型可以附加到不同的视图,反之亦然)。
  • 它不包含“特定于视图”的数据,视图正在使用模型包含的数据。我知道的细微差别。请记住,视图的属性将作为属性添加到 DOM 元素中。因此,如果视图具有id 的属性并且tagName 是div,则生成的DOM 元素将是<div id="{view.attributes.id}" />(伪代码...)。在这种情况下,使用一些模型数据是完全合理的......并且视图可以随意使用它......所以,使用 id 值可能是 'user-' + model.get('id') 的函数。希望对您的理解有所帮助:)
  • 好吧,我是 Backbone/Underscore 的新手(并且不喜欢它),但起初我认为视图应该是可重用的,因此省略了像 age 这样的硬编码内容(使用arguments 或其他代替)。我更了解它,似乎 View 是一个非常具体的,与 DOM 元素相关的东西。现在看看:我们找到了一个很好的理由,为什么我第一次阅读它时 +1 :)
【解决方案2】:

以这种方式声明变量变量的作用域是类而不是实例,类似于s静态或类变量。

是的,查找对象将在您的不同实例之间共享。

您可以在创建它时将查找对象传递给您的实例,这样它将表现为一个实例变量。

【讨论】:

  • 太好了,感谢您的提示。我可能会使用初始化方法,因为每个实例都需要“loopkup”。谢谢