2

我正在尝试编写一个 NopCommerce 插件。我已将我的应用程序相关文件放入插件的根目录中的app命名目录中。在我的shell.js 中 viewmodel,我定义路由如下:

define(['durandal/system', 'durandal/plugins/router', 'service/logger','config'],
    function(system, router, logger,config) {

        var shell = {
            activate: activate,
            router: router
        };

        function activate() {
            logger.log('MyProducts Started', null, system.getModuleId(shell), true);
            router.map([
                { route: '', moduleId: 'viewmodels/myProducts', title: 'My Products', nav: true },
                { route: 'searchProducts', moduleId: 'viewmodels/searchProduct', title: 'Search Products', nav: true },
                { route: 'addProducts', moduleId: 'viewmodels/addProduct', title: 'Add Product', nav: true }
            ]).buildNavigationModel();
            return router.activate();
        }

        return shell;
    }
);

根据约定,它应该转到模块定义的第一条路线:viewmodels/myProducts但我收到以下错误:

[viewmodels/shell] MyProducts Started system.js:75
[main] No router found Object
Navigation Complete undefined Object
Uncaught TypeError: Cannot read property 'router' of undefined 

我正在用井敲我的头。它不会采用默认路由(带有路由:'')。

4

3 回答 3

3

在路线导航期间有同样的问题。结果是空的 js 模块文件 - 我创建了文件,但还没有在其中添加任何内容,并将其添加到路由中。

因此,该消息可能意味着路由器获得了您作为路由控制器源引用的 js 文件之一,但无法从中获取页面控制器对象实例。

于 2015-04-25T18:29:39.887 回答
1

解决 :)

经过一番头疼后,我发现这是导致问题的原因:

define([..., 'durandal/plugins/router',...]

当我删除它并解决它。

main.js编辑:- 以下是在我的文件中定义函数。

define(['durandal/system', 'durandal/app', 'durandal/viewLocator'
                                                            , 'service/logger'],
function (system, app, viewLocator, logger) {
    system.debug(true);

    app.configurePlugins({
        router: true,
        dialog: true,
        widget: true
    });

    app.start().then(function () {
        viewLocator.useConvention();
        app.setRoot('viewmodels/shell', 'entrance');

        //router.mapUnknownRoutes(function (instruction) {
        //    logger.logError('No router found', instruction, 'main', true);
        //});
    });
});
于 2013-09-30T05:33:33.310 回答
0

不要不同意 Durandal 超级明星的惯例,但我认为路由器信息根本不属于 shell。从逻辑上讲,路由器是应用程序核心的一部分,因此属于 main.js 中的应用程序引导逻辑。这是我的 main.js 中定义调用的典型示例:

define(function (require) {

    var system = require('durandal/system'),
        app = require('durandal/app'),
        viewLocator = require('durandal/viewLocator'),
        router = require('plugins/router');

    //>>excludeStart("build", true);
    system.debug(true);
    //>>excludeEnd("build");

    app.title = 'Durandal Starter Kit';
    app.configurePlugins({
        router: true,
        dialog: true
    });

    app.start().then(function() {
        router.map([
            { route: '', title: 'Welcome', moduleId: 'viewmodels/welcome' }
        ]).activate();
        viewLocator.useConvention();
        app.setRoot('viewmodels/shell', 'entrance');
    });
});

我很少使用导航模型功能,所以我不费心构建导航模型。除此之外,引导路由器是同步的,因此定义路由、激活路由器、然后加载 shell 就足够了。

如果您确实需要在 shell 中使用路由器,只需将依赖项添加到您的定义调用中即可

define([..., 'plugins/router', ...], function(..., router, ...) { ... });

或者

define(function (require) { 
    var router = require('plugins/router');
    ...
});

此时,已经激活的路由器将暴露给您的外壳。

于 2013-09-30T14:27:35.847 回答