覆盖现有实例的方法

时间:2016-02-11 17:29:34

标签: javascript durandal override durandal-navigation

我试图扩展已经在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 个答案:

答案 0 :(得分:1)

如果您仍想拨打原始地图"地图"功能,您需要在覆盖它之前存储它。它有点" hacky"以这种方式替换函数,但如果你真的必须这样做,这将起作用:

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
    };