当父 View 添加 subview 的目标元素时,BackBone.js subview 不会渲染其元素

标签 backbone.js rendering parent-child backbone-views

我已经查看了这里的所有 Backbone.js 答案,但没有找到解决我问题的答案;如果我错过了一个,请指出我。

我正在尝试获取 BackBone.js subview 来呈现其父 View 呈现的 HTML 中包含的静态元素。我创建了一个最简单的例子来说明。这是 HTML:

<!DOCTYPE html>
<html>
<head>
  <title>Child View Not Rendering</title>
</head>
<body>
  <div id="parent"></div>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone.js"></script>
  <script src="test.js"></script>
</body>
</html>

这是 test.js Javascript:

(function () {
  var Child = Backbone.View.extend({
    el: '#child',
    render: function () {
      this.$el.html('World');
    }
  });
  var Parent = Backbone.View.extend({
    el: '#parent',
    initialize: function () {
      this.child = new Child();
    },
    render: function () {
      this.$el.html('Hello <span id="child"></span>!');
      this.child.render();
    }
  });
  var parent = new Parent();
  parent.render();
})();

当它运行时,我在浏览器中只看到 "Hello !" 而不是 "Hello World!" 。我究竟做错了什么?提前致谢。

更新

我找到了自己的答案(请参阅下面的“答案”),但现在我仍然想知道我的解决方案是否是最好的方法,或者我是否不应该继续创建新的 child ()Parent.initialize() 中,并弄清楚如何使 Child.$el 表现得就像使用 jQuery.live() 。有想法吗?

更新#2

我找到了另一个答案,将 new Child() 的创建留在 Parent.initialize() (请参阅下面我的“答案”中的更新) 。它需要使用 jQuery 来分配 .$el 属性,并从中重新分配 Child.render() 中的 .el 属性,但感觉就像黑客一样。我再问一下,有没有更好的办法?

更新#3

我能够找到一种更简洁的方法来分配 .$el 属性; .setElement();请参阅下面我的回答中的更新#2。并且仍在寻找更好的方法。

更新#4

找到了一种创建“父”类的方法,该类封装了丑陋之处,尽管它不是 composable与其他 .constructor() 链接;请参阅下面我的回答中的更新#3。我还是想找个mixin strategy需要最少的代码来扩展 View 。 所以这就是我将这个问题留待讨论;有人有很好的答案吗?提前致谢。

更新#5

在这里刮更新#4;它会导致一系列问题。 **所以,如果任何人都可以解决这些问题,并将其作为一个可行的混合,不需要大量的代码来混合,我会很乐意给他们选定的答案。提前致谢。

最佳答案

发生这种情况是因为子元素只是在内存中渲染,而从未添加到 DOM 中。您将 #child 作为 subview 的元素,但这不在 HTML 中。所以你可以将 HTML 更改为:

<div id="parent"></div>
<div id="child"></div>

这会将“World”放入#child内的DOM中..

但是,我假设因为它们被命名为父级和子级,所以您实际上希望它们嵌套,在这种情况下,父级将负责渲染子级。如果是这样,请将您的 subview 更改为:

var Child = Backbone.View.extend({
    id: 'child',
    render: function () {
        this.$el.html('World');
        return this;
    }
});

这会删除“el”选择器并添加“id”属性,因为这是动态创建的。其次,渲染方法返回 this 是因为:“一个好的约定是在渲染结束时返回 this 以启用链式调用。” - 主干文档。

然后在您的父 View 中您可以调用:

this.$el.append(this.child.render().el);

它将子元素渲染到内存中,然后将其添加到父 div 内的 DOM 中。

关于当父 View 添加 subview 的目标元素时,BackBone.js subview 不会渲染其元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17886720/

相关文章:

ruby-on-rails - ruby rails : Creating child objects

backbone.js - 主干js中的set和save方法有什么区别?

javascript - @Input() 未按预期在 Angular 2 应用程序中的父子组件之间传递

c - Fork(),等待所有子进程完成 vs 等待一个子进程完成

ruby-on-rails-3.1 - 无法在 coffeescript 中呈现部分 coffeescript

android - iOS App 中的文本渲染

ios - UITableView在滚动期间停止渲染

javascript - Firebase 和 Backbone : Trouble using uid as a key

javascript - 为什么在实现事件时不使用 IIFE 来保护隐私?

javascript - Backbone.js 在 View 中渲染集合