2016-02-11 109 views
0

我试图扩展已经在RequireJS帮助下创建的现有Durandal路由器插件实例。覆盖现有实例的方法

应该重写方法map()以添加额外的映射参数。

我应该如何从修改后的方法访问原始方法?

index.js

define([ 'durandal/app', 'app/childRouter'], function(
     app, childRouter) { 
    childRouter.map([ { 
     route : 'details/:id', 
     moduleId : 'details/index', 
    }, { 
     route : 'details/tabs/base', 
     moduleId : 'details/tabs/base', 
    } ]); 
    childRouter.buildNavigationModel(); 

    return { 
     router : childRouter 
    }; 
}); 

childRouter.js

define([ 'durandal/app', 'plugins/router'], function(
     app, router) { 

    var childRouter = router.createChildRouter(); 
    childRouter._map = childRouter.map; 
    childRouter.map = function(data) { 
     data.unshift({ 
      route : [ '', 'grid' ], 
      moduleId : 'grid/index', 
     }); 
     childRouter._map(data);//CALLS THE OVERRIDEN METHOD AGAIN INSTEAD OF ORIGINAL 
    }; 
    return childRouter; 
}); 

回答

1

如果你想还叫原来的 “映射” 功能,你需要在你面前将其存储覆盖它。这是一个有点“哈克”,以取代在这样的功能,但如果你真的不得不这样做,这将工作:

var childRouter = router.createChildRouter(); 
childRouter.originalMap = childRouter.map; // Save original 
    childRouter.map = function(data) { 
     data.unshift({ 
      route : [ '', 'grid' ], 
      moduleId : 'grid/index', 
     }); 
     childRouter.originalMap(data); // Call original 
    }; 
+0

尝试过,但不是调用原来'图()',它调用重写再一次。我不明白发生了什么事? –

+0

我需要一个小小的澄清:你打算在覆盖的内部调用原始地图功能吗?或者你希望它只能在一般情况下被调用? – jestermax

+0

看看这个JSFiddle:https://jsfiddle.net/nya30kmv/9/ – jestermax