2013-08-02 6 views
2

У меня есть файл backbone-extend.js, который я загружаю в require define в app.js. Он имеет класс Backbone.View-расширителя, определяющий несколько вспомогательных методов. Два метода отлично работают в моих представлениях, всегда ошибки с Uncaught TypeError: Object [object global] has no method 'gotoUrl'. Почему бы этот метод не был определен, а два других работают нормально? Видите ли вы какие-либо проблемы в этом коде ...Нагрузка на базовый файл расширения, некоторые помощники работают, один не

// Filename: backbone-extend.js 

define([ 
    'jquery', 
    'underscore', 
    'backbone' 
], function($, _, Backbone) { 

    var helpers = { 
     eventSyncError: function(model,response,options) { 
      console.log('Sync error='+response.statusText); 
      $('#server-message').css({'color':'red', 'font-weight':'bold'}).text(response.statusText); 
     }, 

     gotoUrl: function(url,delay) { 
      var to = setTimeout(function() { Backbone.history.navigate(url, true); }, delay); 
     }, 

     getFormData: function(form) { 
      var unindexed_array = form.serializeArray(); 
      var indexed_array = {}; 

      $.map(unindexed_array, function(n, i) { 
       indexed_array[n['name']] = n['value']; 
      }); 

      return indexed_array; 
     } 
    } 

    _.extend(Backbone.View.prototype, helpers); 

}); 

Вот код в виду, что это называет ...

eventSyncMemberSaved: function(model,response,options) { 
     console.log("Member saved!"); 
     $('#server-message').css({'color':'green', 'font-weight':'bold'}).text("Member saved!"); 
     this.gotoUrl('members',2000); 
     //setTimeout(function() { Backbone.history.navigate('members', true); }, 2000); 
    }, 

    saveMember: function() { 
     var data = this.getFormData($('#member-form')); 
     this.member.save(data, { success: this.eventSyncMemberSaved }); 
    }, 

Заранее спасибо за вашу помощь. Я застрял. не

+1

Вы можете также разместить пример того, где вы вызываете его. Это не имеет смысла без контекста. –

+0

@ Sushanth--: Добавлен немного кода вида, показывающего вызов метода помощника. – Locohost

ответ

0

Контекст this отличается в success callback.

Он больше указывает на взгляд нет, поскольку это указывает на xhr объекта

Так выдает ошибку, как этот метод не доступен на объекте xhr

Для его решения вам необходимо связать context с этим обработчиком успеха, чтобы он по ints к нужному объекту.

Таким образом, в Initialize в представлении добавить этот код

initialize: function() { 

    _.bindAll(this, 'eventSyncMemberSaved'); 
} 
+0

Это сработало! Спасибо Сушанту. Однако, глядя на это, я думаю об уродливом коде. Возможно, мне следует пересмотреть, где живут некоторые «вспомогательные» методы. Может быть, класс Helper со статическими методами. – Locohost

+0

@ Locohost .. Рад помочь ... Вы тоже можете это сделать. Зависит от того, как вы с ним комфортно –