【问题标题】:Not able to append html elements to el in backbone.无法将 html 元素附加到主干中的 el。
【发布时间】:2012-12-01 01:02:25
【问题描述】:

我似乎对下面的代码有问题。我的 html 中有一个 id='content' 的 div 元素。我想用 div 元素替换 el 属性的 'body' 元素,但是当我输入 el: $('div') 或 el:$('div#content') 或 el: $( '#内容')。我是backbone.js的初学者,据我了解,我相信这个el属性包含我们的父标签,我们所有的模板都将作为子元素添加(在这种情况下,'body'标签是父标签,'p'标签是孩子)。

(function($){
    var ListView = Backbone.View.extend({
    el: $('body'),      

    initialize: function(){
        this.render();
    },

    render: function(){
        (this.el).append("<p>Hello World</p>");
    }
});

var listView = new ListView();
})(jQuery);

【问题讨论】:

    标签: javascript backbone.js frameworks


    【解决方案1】:

    View.el 属性应定义为 jQuery 选择器(字符串),而不是对 HTML 元素的引用。

    来自Backbone documentation

    var BodyView = Backbone.View.extend({
      el: 'body'
    });
    

    或者如你所愿,

    el:'div#content'
    

    当视图初始化时,Backbone 引用其中的元素,使其通过 view.$elproperty 可用,这是一个缓存的 jQuery 对象。

    this.$el.append("<p>Hello World</p>");
    

    您发布的示例代码有效,因为始终只有一个bodyelement,并且在呈现您的视图时该元素已经存在于DOM中。因此,当您声明 el:$('body') 时,您会获得对 body 元素的引用。 renderin 中的代码有效,因为 this.el 现在是对 jQuery 对象的直接引用:

    (this.el).append("<p>Hello World</p>");
    

    如果您需要使用现有 DOM 元素(而不是选择器)初始化 Backbone 视图,Backbone 文档建议将其传递给 initialize 函数。

    【讨论】:

    • 有趣的是,我的代码(使用 div 标签而不是 body 标签)在 jsfiddle 中工作,而不是在我的计算机中。最重要的是,this.$el. 在选择 div 标签时是 undefined
    • @jaykumarark,您还没有发布到 jsfiddle 的链接,但我最好的猜测是,在 jsfiddle 中,视图是在 body.onload 事件处理程序中定义的(在加载 DOM 之后),因此该元素已经存在。
    • jsfiddle.net/whcmU/4 这就是链接。似乎该代码不会在我的计算机中呈现我的 div 标签中的文本。
    • @jaykumarark,正如我猜想的那样:如果在 jsfiddle 的框架选择(屏幕左上角)中将加载步骤从 onLoad 更改为“no wrap (head)”,它将不会也不能在 jsfiddle 中工作。这是因为当您尝试获取对元素的引用时,未加载 DOM。将选择器字符串用作 view.el 并且仅在加载 DOM 后初始化视图,它将起作用。见:jsfiddle.net/A4MZs
    • 嘿,非常感谢您指出了这个明显的错误。 :) 我真傻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多