2015-06-11 2 views
0

У меня есть простая ситуация и не могу понять, почему переменная, которую я передаю функции всегда undefined.Магистральная маневровая переменная для просмотра метода

var ProjectItemView = Backbone.Marionette.ItemView.extend({ 
     template: "#ProjectItemTemplate", 

     initialize: function() { 

      var id = this.model.get('project_id'); 

      $.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) { 

       this.renderProgress('4'); //<== pass here 
      }); 

     }, 

     renderProgress: function (why) { 
      alert(why); //<== undefined 
     ... 
     }, 
    ... 
}); 

Ожидаю, что оно равно «4». На следующем шаге я хочу передать «данные», но теперь понимаю, что ничего не могу передать.

ответ

0

Вы теряете контекст в обратном вызове $ .getJSON. Попробуйте это:

var ProjectItemView = Backbone.Marionette.ItemView.extend({ 
     template: "#ProjectItemTemplate", 

     initialize: function() { 

      var id = this.model.get('project_id'); 
      var _this = this; 

      $.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) { 

       _this.renderProgress('4'); //<== pass here 
      }); 

     }, 

     renderProgress: function (why) { 
      alert(why); //<== undefined 
     ... 
     }, 
    ... 
}); 
3

Поскольку вы вызываете renderProgress о возвращении $.getJSON вы можете просто предоставить ссылку на функцию к done() метода возвращенного JQuery Promise. Ваш код будет выглядеть следующим образом:

var ProjectItemView = Backbone.Marionette.ItemView.extend({ 
     template: "#ProjectItemTemplate", 

     initialize: function() { 

      var id = this.model.get('project_id'); 

      $.getJSON('service/api.php/projects/' + id + '/progress') 
      .done(this.renderProgress); 
     }, 

     renderProgress: function (data) { 
      alert(data); 
     ... 
     }, 
    ... 
}); 

Если вам нужен контекст представления внутри renderProgress (как, например, для обозначения свойства вида), а затем обеспечить done() версию renderProgress, который связан с точки зрения контекст:

$.getJSON('service/api.php/projects/' + id + '/progress') 
.done(_.bind(this.renderProgress, this)); 

где _.bind является функцией UnderscoreJS. Узнайте больше об этом here.

+0

Я хочу сказать taht 'var _this = this;' и ваше второе решение работает нормально. О первом - я вижу переменную и передаю ее в «sub view» (и это доступно даже в teplateHelper), но subview не является рендерингом и не имеет ошибок. –

+0

Странно, что ошибок нет. Но что происходит заключается в том, что вы, вероятно, передаете 'data' в subview, на которое ссылается ключевое слово' this' JS. Поскольку первый метод не связывает 'this.renderProgress' с представлением' this', то 'this' внутри' renderProgress' не будет включать свойства вашего представления. – seebiscuit

0

У вас нет доступа к это внутри «$ .getJSON (» присвоить это любой переменной, а затем вызвать «renderProgress» метод.

var currentObj = this; 

$.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) { 

       currentObj .renderProgress('4'); //<== pass here 
      }); 

, потому что в вашем случае это указывает на текущий объект этой функции, а не для просмотра объекта.

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