2016-02-11 207 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