2012-06-26 30 views
2

我正在尝试设置Backbone应用程序。下面这段代码给予以下错误:Backbone this.el jQuery

Uncaught TypeError: Object # has no method 'append'

define(
    [ 
     'jQuery', 
     'Underscore', 
     'Backbone', 
     'text!templates/start.html' 
    ], 

    function ($, _, Backbone, startTemplate) 
    { 
     var StartView = Backbone.View.extend({ 

      // properties 
      el: $('#container'), 

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

      render: function() 
      { 
       var template = _.template(startTemplate); 
       this.el.append(template); 
      } 
     }); 

     return new StartView; 
    } 

); 

但这个工作(见 'render'功能):

define(
    [ 
     'jQuery', 
     'Underscore', 
     'Backbone', 
     'text!templates/start.html' 
    ], 

    function ($, _, Backbone, startTemplate) 
    { 
     var StartView = Backbone.View.extend({ 

      // properties 
      el: $('#container'), 

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

      render: function() 
      { 
       var template = _.template(startTemplate); 
       $(this.el).append(template); 
      } 
     }); 

     return new StartView; 
    } 

); 

我传递$(' #集装箱')作为'el'属性,所以我认为这应该工作得很好。为什么我必须为这个例子再次使用jQuery符号。 $(this.el)而不是this.el

很多很多很多预先感谢!

回答

13

骨干,您只需提供身份证或类名el

el: '#container' 

然后,this.el引用的DOM元素,(如果你使用的是最新骨干),this.$el引用jQuery对象。

如果你的主干是最新的,$(this.el)是没有必要的

+3

通过硬编码的ID使代码demonstrably少重复使用实际上提供的视图本身的DOM节点。如果你将它传递给你的视图构造器(控制反转)并且帮助你为你的代码编写测试,Backbone自动为你设置'this.el',因为你可以使用HTML元素而不是DOM节点。 'var myView = new MyView({el:'#container'}); //会产生同样的影响' – phawk