要在模板中引用的 Backbone.js 集合赋值函数

xfyts7mz  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(118)

有没有一种方法可以使用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逻辑到模板,但这似乎是最简单的方法。

oyjwcjzk

oyjwcjzk1#

首先,mutators不是 Backbone.js 或牵线 puppet 的一部分。看起来你使用的是Backbone.Mutators插件。而且它应该和模型一起使用而不是和集合一起使用。
您的代码有很多问题。首先,以下代码无效

foo: {
        if (this.models.length)
            return this.models[0].get('foo');
        return "default value";
    }

第二,您尝试从集合和模型的构造函数访问属性。您应该使用数据创建它们的示例,并从集合示例的models属性访问模型示例。

<div>
  <h1><%= myCollection.foo %></h1>
  <% for (var myModel of myCollection.models) { %>
      <span><%= myModel.get("foo") %></span>
  <% } %>
</div>

我怀疑它们是否能与集合一起工作,因为我在文档中没有看到任何与集合有关的示例。
请阅读您正在使用的插件和框架的文档,并尝试了解您正在做什么...

btqmn9zl

btqmn9zl2#

Backbone.Mutators插件似乎不支持Collection。似乎最简单的替代方法是将Object添加到Marionette.ViewserializeData方法中,即:

serializeData: function() {
    return { models: this.collection.models, foo: this.collection.foo().toJSON() };
}

这里Mutators甚至不是必需的,foo只是MyCollection中的一个函数。

qlvxas9a

qlvxas9a3#

你需要有视图来处理模板和渲染。Marionette有一个CollectionView api,这可能是你正在寻找的,https://marionettejs.com/docs/master/marionette.collectionview.html#rendering-collectionviews引用自文档:
CollectionView将遍历指定集合中的所有模型,使用指定的childView呈现每个模型,然后将子视图的el的结果追加到集合视图的el。默认情况下,CollectionView将在DOM中维护排序后的集合顺序。通过指定{sort:false}。

相关问题