Rendr如何在RendrJS同构框架中将模型传递给子视图

时间:2015-11-01 14:18:05

标签: javascript rendr

假设我正在构建一个博客,其中主页呈现博客帖子列表。我的问题是如何将模型传递给每个子视图?

我有一个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输出。传递模型需要做什么,我是否需要在视图中手动构建它?谢谢!

3 个答案:

答案 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>

帖子列表模板(posts / list.hbs)

<div class="media-list">
    {{#each _collection.models}}
        {{view "posts/item" model=this}}
    {{/each}}
</div>

如果使用forEach

{{#forEach _collection.models}}
    {{view "posts/item" model=value}}
{{/forEach}}

发布项目模板(posts / item.hbs)

<div class="media">
  <div class="media-body">
    <h4 class="media-heading">{{title}}</h4>
    {{description}}
  </div>
</div>

我也有这个链接,我用来试图将那些对我们有用的约定放在一起:

https://github.com/crwang/rendr-conventions

答案 2 :(得分:0)

答案最终是不正确使用parse()方法。我原来的故事集有一个像这样的属性

parse: function(rsp) {
    return rsp.stories;
}

因为API响应包含一些元数据以及&#34;故事下的一系列故事&#34;键。我删除了那个解析方法,而是添加了

 jsonKey: 'stories'

这解决了我的问题。