0
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 注册。

这似乎很尴尬。在我过去的项目中,我总是以前一种方式进行操作,并且一直有效。

4

2 回答 2

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);
    });
}
于 2013-02-18T13:29:25.793 回答
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,这是原始 dom 元素,没有您通常使用 $el 获得的 jQuery 包装器。

试试这个: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);
    });
}
于 2013-02-18T13:29:31.900 回答