有没有一种方法可以使用Backbone.js
/Marionette
来使用类似于Model
中的mutator,但是在Collection
上使用?例如:
在MyCollection.js
中:
export default Backbone.Collection.extend({
model: MyModel,
...
mutators: {
foo: function() {
if (this.models.length)
return this.models[0].get('foo');
return "default value";
}
}
})
则在MyModel.js
中:
export default Backbone.Model.extend({
mutators: {
foo: function() {
return "bar";
}
}
})
在template.ejs
中:
<div>
<h1><%= myCollection.foo %></h1>
<% for (var myModel of myCollection) { %>
<span><%= myModel.foo %></span>
<% } %>
</div>
我似乎得到了TypeError: Cannot read property 'foo' of undefined
错误,所以我想知道这是否是可能的,或者是否有一个替代的方法?我想避免移动MyCollection.foo
逻辑到模板,但这似乎是最简单的方法。
3条答案
按热度按时间oyjwcjzk1#
首先,mutators不是 Backbone.js 或牵线 puppet 的一部分。看起来你使用的是Backbone.Mutators插件。而且它应该和模型一起使用而不是和集合一起使用。
您的代码有很多问题。首先,以下代码无效
第二,您尝试从集合和模型的构造函数访问属性。您应该使用数据创建它们的示例,并从集合示例的
models
属性访问模型示例。我怀疑它们是否能与集合一起工作,因为我在文档中没有看到任何与集合有关的示例。
请阅读您正在使用的插件和框架的文档,并尝试了解您正在做什么...
btqmn9zl2#
Backbone.Mutators插件似乎不支持
Collection
。似乎最简单的替代方法是将Object
添加到Marionette.View
的serializeData
方法中,即:这里
Mutators
甚至不是必需的,foo
只是MyCollection
中的一个函数。qlvxas9a3#
你需要有视图来处理模板和渲染。Marionette有一个CollectionView api,这可能是你正在寻找的,https://marionettejs.com/docs/master/marionette.collectionview.html#rendering-collectionviews引用自文档:
CollectionView将遍历指定集合中的所有模型,使用指定的childView呈现每个模型,然后将子视图的el的结果追加到集合视图的el。默认情况下,CollectionView将在DOM中维护排序后的集合顺序。通过指定{sort:false}。