0

我有一个使用 DurandalJS 和 KnockoutJS 的 SPA。在我的初始页面上,我允许单击一个项目,然后加载该项目的辅助页面。这是我访问二级页面的方式:

var goToDetails = function (selectedDailyLog) {

        var url = '#/dailylog/' + selectedDailyLog.id();

        //durandal/plugins/router is sammy.js

        router.navigateTo(url);

    };

在辅助页面上,我尝试调用 ko.applyBindings 并且不断收到以下错误:

未捕获的错误:无法解析绑定。消息:ReferenceError:未定义路由器;绑定值:foreach: router.visibleRoutes

这是辅助页面的 javascript:

define(['config', 'durandal/system', 'services/logger', 'services/dataservice'],
function (config, system, logger, dataservice) {

    var owners = ko.observableArray();
    var selectedOwner = ko.observable();
    var dailyLog = ko.observable({ started: 'one' });
    var routeCriteria;

    //#region Internal Methods
    function activate(routeData) {      

        routeCriteria = routeData;
        dataservice.getOwners(owners);

        logger.log('Daily Log Activated with Id: ' + routeData.id.toString(), null, 'dailylog', true);

        return true;
    }

    var vm = {
        activate: activate,
        title: 'Daily Log',
        owners: owners,
        selectedOwner: selectedOwner,
        dailyLog:dailyLog
    };
    ko.applyBindings(vm);
    return vm;

});

在此先感谢您的帮助。

4

2 回答 2

2

在上面的例子中有几件事跳出来了。首先,在 Durandal 应用程序中,没有理由ko.applyBindings(vm)自行调用,因为这已包含在 Durandal 的组合系统中。其次,activate 函数返回 true,如果dataservice.getOwners(owners)是同步操作,则允许这样做,否则您必须确保返回一个 Promise。

让我们看看 ko.applybinding(vm) 运行并产生错误消息时会发生什么。在没有第二个参数的情况下运行 ko.applyBinding 时,它会尝试将 vm 绑定到整个 DOM。这会在第一次出现未在 vm 中定义的属性时发生冲突。例如,默认启动模板在 shell.html 或 nav.html 中有一个导航部分,例如https://github.com/dFiddle/dFiddle-1.2/blob/gh-pages/App/samples/shell.html#L4

<div>
    <div class="navbar navbar-fixed-top">
        <div class="navbar-inner">
            <a class="brand" data-bind="attr: { href: router.visibleRoutes()[0].hash }">
                <i class="icon-home"></i>
                <span>Durandal</span>
            </a>

在示例中,返回的 vm 没有定义路由器,因此系统会产生错误。

var vm = {
    activate: activate,
    title: 'Daily Log',
    owners: owners,
    selectedOwner: selectedOwner,
    dailyLog:dailyLog
};
// ko.applyBindings(vm); // Do NOT call applyBinding in a Durandal app
return vm;

但是如上所述,您只是看到了最初不应该拨打的电话的症状。您可能想查看https://github.com/RainerAtSpirit/Durandal-Fiddlehttps://github.com/johnpapa/PluralsightSpaJumpStartFinal之类的示例,以了解有关 Durandal 构建原则的更多信息。

于 2013-06-22T12:03:26.303 回答
0

我可能的意思是视图正在寻找路由数据来绑定一些导航链接。在您发布的代码中,您不会返回路由对象。

我不确定您的应用程序是如何设置的,但这可能会有所帮助:

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

... your code here ...

var vm = {
    activate: activate,
    title: 'Daily Log',
    owners: owners,
    selectedOwner: selectedOwner,
    dailyLog:dailyLog,
    router: router
};
ko.applyBindings(vm);
return vm;
于 2013-06-22T06:39:18.003 回答