为什么我的“el”不能在Backbone中工作?

时间:2013-02-18 13:26:30

标签: javascript jquery backbone.js underscore.js

define([
    'jquery',
    'underscore',
    'backbone',
    'text!modules/index/templates/container.html'
], function($, _, Backbone, container_temp){
    var indexView = Backbone.View.extend({
        el: $('.main_container'),
        initialize:function(){
            _.bindAll(this, 'render');
        },
        render:function(){
            var $this = this;
            var $el = this.el;
            $.get('/js/index/render', {}, function(data){
                var dat = JSON.parse(data);
                $this.pars = dat;
                var tpl = _.template(container_temp, dat);
                $el.html(tpl);
            });
        }
    });
    return new indexView;
});

运行此代码应该用HTML填充$ el。但是,我的浏览器在$el.html(tpl);搞砸了。

Uncaught TypeError: Object #<HTMLDivElement> has no method 'html' 

要解决这个问题,我必须这样做:$($el).html(tpl);以便jquery注册。

这看起来很尴尬。在我以前的项目中,我总是以前一种方式完成它,并且它始终有效。

2 个答案:

答案 0 :(得分:3)

this.el是一个原始DOM元素,但html方法属于jQuery。

在渲染方法中尝试var $el = this.$el;

render:function(){
    var $this = this;
    var $el = this.$el;
    $.get('/js/index/render', {}, function(data){
        var dat = JSON.parse(data);
        $this.pars = dat;
        var tpl = _.template(container_temp, dat);
        $el.html(tpl);
    });
}

答案 1 :(得分:2)

如果你看一下你的渲染函数:

render:function(){
        var $this = this;
        var $el = this.el;
        $.get('/js/index/render', {}, function(data){
            var dat = JSON.parse(data);
            $this.pars = dat;
            var tpl = _.template(container_temp, dat);
            $el.html(tpl);
        });
    }

你明确指定var $el所以下面的$ el等于this.el,这是没有你通常用$ el获得的jQuery包装的原始dom元素。

试试这个:this.$el没有var declaration

因此,要将$ el放入$ .get范围,代码将如下所示:

render:function(){
    var $this = this;
    var element = this.$el;
    $.get('/js/index/render', {}, function(data){
        var dat = JSON.parse(data);
        $this.pars = dat;
        var tpl = _.template(container_temp, dat);
        element.html(tpl);
    });
}