【问题标题】:backbone.js / underscore.js error: has no method 'html'骨干.js / underscore.js 错误:没有方法'html'
【发布时间】:2012-05-26 09:52:55
【问题描述】:

当我尝试导入看起来像这样的模板时,我似乎遇到了带有backbone.js / underscore.js 的砖墙:

<script type="text/template" id="overview_template">
<div>
  Sample text
</div>
</script>

错误显示:

Uncaught TypeError: Object #<HTMLDivElement> has no method 'html' navigation.js:356 
Backbone.View.extend.render navigation.js:356 
Backbone.View.extend.initialize navigation.js:351 
g.View backbone-min.js:33 d backbone-min.js:38 
(anonymous function) navigation.js:379 
f.Callbacks.n jquery-1.7.1.min.js:2 
f.Callbacks.o.fireWith jquery-1.7.1.min.js:2 
e.extend.ready jquery-1.7.1.min.js:2 c.addEventListener.B

下面触发错误的代码是this.el.html(template);

 var OverviewView = Backbone.View.extend({
  el: $('#overview_container'),

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

  render: function() {
    var template = _.template( $("#overview_template").html(), {} );
    this.el.html(template);
  },

  defaults: {
    tip_of_the_day: 'open',
    news: 'open',
    recent_presentations: 'open'
  },

  events: {
    "click .overview_subsection_header": "toggleSubsection"     
  },

  toggleSubsection: function (event) {
    $(this).parent().find('.overview_subsection_content').toggle();
  }
 });

 var overview_view = new OverviewView(); 

我不确定是什么原因造成的,但这让我发疯了。

【问题讨论】:

    标签: javascript ruby-on-rails backbone.js


    【解决方案1】:

    .html() 方法是 jQuery 对象的方法。当你使用 this.el - 它是一个 DOM 对象。要获取 jQuery 对象,请使用 this.$el(它由backbone.js jQuery 对象缓存)或$(this.el)。

    所以,你的代码应该是这样的:

      render: function() {
        var template = _.template( $("#overview_template").html(), {} );
        this.$el.html(template);    
      }
    

      render: function() {
        var template = _.template( $("#overview_template").html(), {} );
        $(this.el).html(template);    
      }
    

    【讨论】:

      【解决方案2】:

      不应该是这样的

      this.$el.html(template);

      即。 jQuery 包裹的 el。

      【讨论】:

        【解决方案3】:

        您正在尝试将视图连接到现有元素#overview_container。但可以肯定的是,视图类是在浏览器初始化 DOM 之前创建的。

        由于您的模板存储在#overview_container,大概您不希望视图在该元素中呈现?尝试删除视图上的 el 属性并将视图的元素附加到页面中您想要的任何位置。

        此外,从 render 方法返回 this 是 Backbone 约定,因此您可以轻松渲染和附加元素,如下所示:

        $(document.body).append((new OverviewView()).render().el);
        

        如果您愿意,可以在初始化程序中 render,但这不是标准做法。

        【讨论】:

          【解决方案4】:

          试试

          this.$el.html(template) 
          

          而不是

          this.el.html(template)
          

          【讨论】:

            猜你喜欢
            • 2012-03-10
            • 1970-01-01
            • 2013-04-28
            • 2012-11-23
            • 1970-01-01
            • 2013-07-26
            • 2012-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多