2012-03-20 70 views
0

我一直无法使用jquery.AOP调用Backbone函数。它在全局函数和JavaScript模块上运行良好。使用jquery.aop调用Backbone.js函数的范围问题

require(['app', 'jquery' ], 
    function(App, $) {  
    App.initialize(); 
    $.aop.before({target: App.appRouter 
       method: 'helloWorld'}, 
      function() { 
       alert("before Hello World"); 
       } 
});  

在我的例子中,app.appRouter绝对是一个活着的实例变量。 这里是应用程序与它的appRouter:

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

var appRouter = Backbone.Router.extend({ 
    initialize: function() { 
     //some code 
    }, 
    helloWorld: function(){ 
       alert("hello world"); 
     } 

}); 


var initialize = function(){ 
    this.appRouter = new appRouter(this); 
    Backbone.history.start(); 

}; 


return { 
     initialize: initialize, 
     appRouter : this.appRouter 

}; });

看起来像范围问题,因为以前的建议永远不会达到。 感谢您的任何想法, 吉米

回答

0

这可能是一个时机问题。

$ .aop通过用新函数替换目标函数并维护对原始目标的引用来工作。当你调用这个函数时,它的aop版本被执行,并且它又调用原始函数。

鉴于此,尝试用$.aop...呼叫交换的呼叫App.initialize()


$.aop.before({ 
    target: App.appRouter 
    method: 'helloWorld'}, 
    function() { 
    alert("before Hello World"); 

}); 
App.initialize(); 

我的另一个想法是,我没有看到你的代码正在调用该路由器的helloWorld方法的任何地方。你确定你真的在打电话吗?

+0

我试过将两个调用都交换到无效。是的,当单击链接导致Backbone路由器的路由并将触发器选项设置为true时,该功能将被调用。这可能是jquery.aop无法调用它的原因。但是,调试时,Firebug中很好地存在App.appRouter.helloWorld函数。 – 2012-03-20 12:38:06

+0

最后一个想法,那么:你的路由器是否有正确定义的路由?你不会在你发布的代码中显示实际的'routes:{...}'。如果没有定义路由,路由器将不会执行任何操作。 ...对不起,如果这是显而易见的,只是关闭我在帖子中看到的 – 2012-03-20 12:44:59

+0

骨干路由器正确地写入路由,事件......但是我发现了一些东西:通过做$ .aop.before({target:App。 appRouter方法:''},function(){alert(“Hello World”之前);}); ,appRouter的所有功能都被正确地称为aop.before块,是否有动态地获取目标和方法?这可能最终导致我的调用者 – 2012-03-20 12:53:04