Связывание композиции Durandal с помощью canDeactivate

Я использую Durandal 2.1, и у меня проблема с композицией представления. У меня есть представление для управления многими типами элементов. Я также хочу, чтобы представление управляло подмножеством этих типов. Поэтому я создал представление управления и представление управления подмножеством. Представление managesubset просто составляет представление управления и передает ему массив, содержащий подмножество элементов. Таким образом, пользователь может перейти к /100/manage или 100/managesubset, где managesubset позволит пользователю управлять только подмножеством элементов. Я использую этот шаблон, потому что у меня будет несколько разных версий managesubset.

Моя проблема в том, что метод canDeactivate не запускается при переходе к managesubset. Есть ли способ запускать события жизненного цикла canDeactivate и Deactivate при составлении?

Согласно № 3 в разделе Обратные вызовы жизненного цикла активатора здесь, я должен быть в состоянии сделать это , но я не могу найти хороших примеров.

Код:

manage.js

define(['durandal/app', 'plugins/router'], function (app, router) {
    var constructor = function () {
        var self = this;
        //...variable creation and assignment

        //life cycle events
        self.activate = function (viewmodel) {
            self.recordId(viewmodel.recordId);
            self.assignableTypes(viewmodel.assignableTypes);
            self.pageHeaderTitle = viewmodel.pageHeaderTitle;
            self.pageHeaderIcon = viewmodel.pageHeaderIcon;
        };

        self.canActivate = function (id) {
            var deferred = $.Deferred();

            //check if user has access to manage equipment

        };

        self.canDeactivate = function () {
            if (!self.saveSuccessfull() && this.isDirty()) {
                return app.showMessage("You have unsaved changes, are you sure you want to leave?", "Unsaved Changes", ["Yes", "No"]);
            }
            else {
                return true;
            }
        }
    };

    return constructor;
});

managesubset.js

 define([], function () {
    var recordId = ko.observable();
    var manageRecord = ko.observable();

    return {
        recordId: recordId,
        manageRecord: manageRecord,
        activate: function (id) {
            recordId(id);
            manageRecord({
                pageHeaderTitle: 'Manage Subset',
                pageHeaderIcon: 'cb-subset',
                assignableTypes: [102],
                recordId: recordId()
            });
        },
        canActivate: function (id) {
            var deferred = $.Deferred();

            //check if user has access to manage equipment
        }
    }
});

managesubset.html

 <div data-bind="compose: { model: 'manage', activationData: manageRecord() }"></div>

Активация вызывается правильно каждый раз. Деактивация и canDeactive - это то, что не работает, и они никогда не вызываются.


person Zach Green    schedule 28.04.2015    source источник
comment
возможный дубликат Durandal Compose: метод активации не всегда вызывается, пожалуйста, позвольте мне узнайте, решит ли это вашу проблему   -  person Matthew James Davis    schedule 28.04.2015
comment
не совсем. активация вызывается правильно каждый раз. deactivate и canDeactive не работают, и они никогда не вызываются. вариант дочернего маршрутизатора может работать, но это кажется излишним.   -  person Zach Green    schedule 28.04.2015
comment
Есть ли ошибки в окне Консоли браузера?   -  person Nathan Fisher    schedule 07.05.2015
comment
Нет. Похоже, что canDeactivate и Deactivate не являются частью жизненного цикла композиции и не могут быть частью жизненного цикла.   -  person Zach Green    schedule 07.05.2015
comment
Что вы устанавливаете для app.setRoot() в файле основного модуля?   -  person Brett    schedule 17.06.2015
comment
привет @Zach, ты смог это исправить? я тоже с таким сталкиваюсь   -  person Habib    schedule 29.10.2015
comment
Нет. Я точно не помню, но я почти уверен, что изменил то, как я делал, чтобы не использовать canDeactivate в составных моделях.   -  person Zach Green    schedule 29.10.2015