【问题标题】:backbone rendering subview inside subview子视图内的主干渲染子视图
【发布时间】:2012-11-14 07:12:05
【问题描述】:

我有一个渲染子视图的人员视图。渲染人物视图和人物视图,但不渲染子视图。调试显示它进入子视图但未呈现。

人民观:

渲染:函数(){ $("#page").html(compiledTemplate); _.each(personViewPointers, function (item) { $(".people-collection").append(item.render().el) }); 返回这个 }

personview 呈现子视图。渲染正常,但不渲染子视图。

渲染:函数(){ 变量数据 = { 模型:this.model, _:_ }; this.$el.html(compiledTemplate(data)) this.addAllSubViews() var self = 这个 _.each(子视图,功能(项目){ self.$el.append(item.render().el) }); 返回这个 }

不渲染的子视图。

渲染:函数(){ this.$el.html(compiledTemplate) 返回这个 }

【问题讨论】:

  • subview的render真的被调用了吗?你试过在上面设置断点吗?
  • 是的。我做了一个简单的模板只是为了测试和 console.log($(this.el)) 在 this.$el.html(compiledTemplate) 给出“
    test
    ”之后。这实际上现在调用了两次,有两个子视图..
  • subviews 来自哪里? personViewPointers 怎么样? $("#page").html(compiledTemplate); 不应该是 $("#page").html(compiledTemplate()); 吗? compiledTemplate 可能是一个返回一些 HTML 而不是 HTML 本身的函数。
  • 从 personview 的集合中添加子视图:this.collection.each(this.addOne) ... subviews[model.id] = new personbillableitemview({model:model})。并且 personViewPointers 以同样的方式从 peopleViews 集合中添加。 compiledTemplate 带有 AMD 使用的文本插件:define([ 'Appregistry', 'collections/admin/peopleCollection', 'views/admin/personView', 'text!templates/admin/people/people.html', 'models/admin/ personDtoModel' ],函数(Appregistry、peopleCollection、personView、peopleTemplate、personDtoModel)。我试过这个:$("#page").html(compiledTemplate()) 不工作

标签: backbone.js


【解决方案1】:

提示

您正在使用 $("#page")$(".people-collection") 将 personview 直接耦合到 DOM。

我建议改用this.$elthis.$(".people-collection")

render:function () {
    this.$el.html(compiledTemplate);
    _.each(personViewPointers, function (item) {
        this.$(".people-collection").append(item.render().el)
    }, this);
    return this
}

并在构造函数中传递#page元素:

var pv = new PersonView({el: '#page'});

但是一旦您使用了new PersonView({el: '#page'}),您就不能真正将“#page”用于其他任何事情,视图已将事件等绑定到元素。所以最好把它作为一个元素添加:

var pv = new PersonView();
$('#page').empty();
$('#page').append(pv.render().this);

这允许删除 pv.remove() 并将元素替换为另一个视图。

【讨论】:

  • 我试过这个:_.each(subviews, function (item) { this.$el.append(item.render().el) this.$el.append("rendered") } , 这);在人员视图上。现在渲染这个“渲染”。这些子视图仍然没有渲染,有什么想法吗?
  • 进一步了解了这一点。问题似乎出在这些 subviewpointers 上。当呈现带有 2 个子视图的第一人称视图时,一切似乎都很好。没有任何子视图的下一个人视图会删除所有子视图,包括以前添加的。
  • 您当前的实现确实使使用多个 PersonView 实例变得复杂。我在答案中添加了“将其添加为元素”部分。
  • 感谢您的回答。通过简短的测试,所有绑定都是从上一个模型绑定的,因此需要研究更多这种将 el 元素传递到新视图的方法。我像你一样成功地使用了“这个”,它似乎工作(渲染到页面),但是将所有这些观察者渲染到每个人视图,所以我添加了检查:_.each(子视图,函数(项目){ if(item.model.get ("person").id == self.model.id){ self.$el.find(".section-content").append(item.render().el) } });.这感觉像是 hack,需要找到更好的方法。
  • 不要对子视图使用全局变量 (personViewPointers),而是使用实例变量 this.personViewPointers,您将在初始化方法中创建它:this.personViewPointers = [];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多