2012-06-26 2 views
2

Я пытаюсь настроить приложение базовой линии. Этот код ниже дает следующее сообщение об ошибке:Магистраль 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'-property, поэтому я предполагал, что это должно работать нормально. Почему я должен снова использовать нотацию jQuery для этого, например. $ (this.el), а не this.el

Большое спасибо!

ответ

13

В Backbone, вы просто указать имя ID или класса в el:

el: '#container' 

Затем this.el ссылается на DOM элемент, и (если вы используете последнюю Backbone), this.$el ссылается на объект JQuery ,

Если Магистральные до настоящего времени, $ (this.el) не является необходимым

+3

На самом деле поставляет узел DOM в самом зрения на жесткое кодирование в ID делает код явно менее многоразовые. Магистраль автоматически устанавливает 'this.el' для вас, если вы передадите его в свой конструктор представлений (инверсия элемента управления), а также поможет вам в написании тестов для вашего кода, поскольку вы можете использовать элемент HTML, а не узел DOM. 'var myView = новый MyView ({el: '#container'}); // Будет иметь такое же влияние ' – phawk

Смежные вопросы