2013-08-02 39 views
2

我有一个backbone-extend.js文件,我加载在app.js中的require定义。它有一个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这个成功处理程序,以便它po整理到正确的对象。

所以在视图的初始化添加以下代码

initialize: function() { 

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

工作!谢谢Sushanth。然而,看着这个我在想它的丑陋代码。也许我应该重新考虑一些“帮手”方法的存在。也许是一个带有静态方法的Helper类。 – Locohost

+0

@Locohost ..很高兴有帮助:)你也可以这样做..取决于你对它的感觉如何 –