2013-06-22 2 views
0

У меня есть SPA, использующий DurandalJS и KnockoutJS. На моей начальной странице я разрешаю щелчок элемента, а затем загружаю вторичную страницу для этого элемента. Это, как я получить доступ к вторичной странице:Нокаут применяется Ошибка обмана

var goToDetails = function (selectedDailyLog) { 

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

     //durandal/plugins/router is sammy.js 

     router.navigateTo(url); 

    }; 

На второй странице я пытаюсь позвонить ko.applyBindings и я постоянно получаю следующее сообщение об ошибке:

Uncaught Ошибка: Невозможно разобрать привязки. Сообщение: 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; 

});

Заранее благодарим за помощь.

ответ

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

Есть несколько вещей, которые выскакивают в приведенном выше примере. Прежде всего, в приложении Durandal нет причин звонить по номеру ko.applyBindings(vm) самостоятельно, так как это покрываетDurandal. Во-вторых, функция активирования возвращает true, что разрешено, если dataservice.getOwners(owners) является синхронной операцией в любом случае, вам нужно будет убедиться, что вы вернете обещание.

Давайте посмотрим, что произойдет, когда 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-Fiddle или https://github.com/johnpapa/PluralsightSpaJumpStartFinal, чтобы узнать больше о принципах строительства Дурандала.