假设我正在构建一个博客,其中主页呈现博客帖子列表。我的问题是如何将模型传递给每个子视图?
我有一个index.hbs遍历集合
{{#forEach models}}
{{view "post_view" model=value model_name="story"}}
{{/forEach}}
我有一个post_view.js
var BaseView = require('./base');
module.exports = BaseView.extend({
className: 'post_view',
initialize: function() {
console.log(this.model); //undefined
console.log(this.options.model); //undefined on client, logs model attributes on server
}
});
module.exports.id = 'post_view';
但似乎模型没有设置在post_view.js中。如果我在{{json value}}
循环中执行{{forEach}}
,我可以看到打印的JSONified输出。传递模型需要做什么,我是否需要在视图中手动构建它?谢谢!
答案 0 :(得分:2)
我没有评论的声誉,但这不是一个答案。
初始化子视图时,model
目前还没有。 postRender()
肯定会在那里,getTemplateData()
应该在那里。我不记得造成这种竞争条件的{{view}}
插件的确切问题,但这是我以前见过的。虫洞在这附近:https://github.com/rendrjs/rendr/blob/master/shared/base/view.js#L438并且可以在服务器上运行但不总是在客户端上运行。
答案 1 :(得分:1)
这就是我们一直在做的事情,它已经很好地进一步抽象它,以便我们可以重复使用“#list”列表'成分
index: function(params, callback) {
var spec = {
posts: {
collection: 'Posts',
params: params
}
};
this.app.fetch(spec, function(err, result) {
callback(err, result);
});
}
<section class="container">
<h2>Recent Posts</h2>
{{view "posts/list" collection=posts}}
</section>
<div class="media-list">
{{#each _collection.models}}
{{view "posts/item" model=this}}
{{/each}}
</div>
如果使用forEach
{{#forEach _collection.models}}
{{view "posts/item" model=value}}
{{/forEach}}
<div class="media">
<div class="media-body">
<h4 class="media-heading">{{title}}</h4>
{{description}}
</div>
</div>
我也有这个链接,我用来试图将那些对我们有用的约定放在一起:
答案 2 :(得分:0)
答案最终是不正确使用parse()方法。我原来的故事集有一个像这样的属性
parse: function(rsp) {
return rsp.stories;
}
因为API响应包含一些元数据以及&#34;故事下的一系列故事&#34;键。我删除了那个解析方法,而是添加了
jsonKey: 'stories'
这解决了我的问题。