1

申請の流れは次のとおりです。

shell.js は、作成または編集ボタンを介して schoolyearwizard.js をロードする schoolyearbrowser.js を含む schoolyeardialog.js をロードします。

これらの手順を複数回繰り返すと、[作成/編集] ボタンをクリックして、SchoolyearWizard で次のように複数の要求を行います。

 $.when(service.editSchoolyear(schoolyearId))

その理由は、私の意見では、サブスクライブされたイベントが正しくサブスクライブ解除されていないためです。

SchoolyearDialog.js ファイルでさまざまな登録解除方法を試しました。

イベントが発生しませんでした-subscription.off();を実行したとき。app.on(...) の後、または間違った位置で登録解除されました。

どこで正しく退会すればよいですか?

ビジュアル スタジオ ソリューションとしてサンプル リポジトリが必要な場合は、これを提供できます。

また、SchoolyearDialog モジュールが「アンロード」されたときに、2 つのイベントの作成/編集からサブスクライブを解除することも考えました。これは、追加または編集ボタンをクリックすると、今のように作成または編集サブスクリプションだけでなく、両方のイベントがサブスクライブ解除される可能性があるためです。 ...どうすればいいですか?

シェル

define(['plugins/router', 'durandal/app', 'viewmodels/SchoolyearDialog', 'knockout'], function (router, app, schoolyearDialog, ko) {

    self.schoolyearIsLoaded = ko.observable(false);

    var saveTimeTableSubscription = app.on('savedTimeTable').then(function (options) {
         // after coming the 2nd time here
        if (!self.schoolyearIsLoaded()) {
            router.map([{ route: 'lessonplanner', moduleId: 'viewmodels/lessonplanner', title: 'lesson planner', nav: true },
                         { route: 'documentbrowser', moduleId: 'viewmodels/documentbrowser', title: 'document browser', nav: true }])
                 .buildNavigationModel();

            self.schoolyearIsLoaded(true);
        }

        router.navigate("lessonplanner", true);
    });


    return {
        router: router,
        activate: function () {
            router.map([{ route: '', moduleId: 'viewmodels/SchoolyearDialog', nav: true, title: 'Schoolyearbrowser' }
            ]).buildNavigationModel();
            return router.activate('SchoolyearDialog');

        }
    };
});

学年ダイアログ

define(['durandal/app', 'knockout', 'plugins/router', 'viewmodels/SchoolyearWizard'],
    function (app, ko, router, wizard) {

        var ctor = function () {
            debugger;
            var self = this;
            self.createSubscribe = ko.observable();
            self.editSubscribe = ko.observable();

            self.activeScreen = ko.observable('viewmodels/SchoolyearBrowser'); // set the schoolyear browser as default module

            var createWizardSubscription = app.on('createWizard').then(function () {

                self.createSubscribe().off();
                self.createSubscribe(null);

                self.activeScreen(new wizard('create'));

            }, self);
            self.createSubscribe(createWizardSubscription);

            var editWizardSubscription = app.on('editWizard').then(function (schoolyearId) {

                self.editSubscribe().off();
                self.editSubscribe(null);

                self.activeScreen(new wizard('edit', schoolyearId));

            }, self);
            self.editSubscribe(editWizardSubscription);
        }
        return ctor;
    });

学年ブラウザ

define(['durandal/app', 'plugins/dialog', 'knockout', 'services/dataservice', 'plugins/router'],
    function (app, dialog, ko, dataservice, router) {
        var SchoolyearBrowser = function () {

            var self = this;
            self.schoolyears = ko.observableArray();

            $.when(dataservice.getSchoolyears())
             .done(function (schoolyearModels) {
                 self.schoolyears(schoolyearModels);
             });

            self.create = function () {
                app.trigger('createWizard');
            }

            self.edit = function () {
                app.trigger('editWizard', 1);
            }
        };

        return SchoolyearBrowser;
    });

学年ウィザード

define(['durandal/activator', 'viewmodels/step1', 'viewmodels/step2', 'knockout', 'durandal/app', 'services/dataservice', 'viewmodels/CreateEditSchoolyearViewModel'],
    function (activator, Step1, Step2, ko, app, service, CreateEditSchoolyearViewModel) {

        var ctor = function (viewMode, schoolyearId) {
            debugger;
            // depending on the mode I could setup 2 different step modules for create and edit ? and the Wizard has one property called content
            if (viewMode === 'edit') {

                $.when(service.editSchoolyear(schoolyearId))
                 .done(function (response) {
                     debugger;
                     self.viewModel(new CreateEditSchoolyearViewModel(response));
                 }).fail(function (error) {
                     alert(error);
                 });
            }
            else if (viewMode === 'create') {

                $.when(service.createSchoolyear())
                 .done(function (response) {
                     debugger;
                     self.viewModel(new CreateEditSchoolyearViewModel(response));
                 }).fail(function (error) {
                     alert(error);
                 });
            }

            var self = this;
            var steps = [new Step1(viewMode), new Step2(viewMode)];
            var step = ko.observable(0);   // Start with first step
            self.activeStep = activator.create();
            var stepsLength = steps.length;

            self.viewModel = ko.observable();

            this.hasPrevious = ko.computed(function () {
                return step() > 0;
            });

            self.caption = ko.observable();
            this.activeStep(steps[step()]);

            this.hasNext = ko.computed(function () {
                if ((step() === stepsLength - 1) && self.activeStep().isValid()) {
                    // save
                    self.caption('save');
                    return true;
                } else if ((step() < stepsLength - 1) && self.activeStep().isValid()) {
                    self.caption('next');
                    return true;
                }
            });

            this.isLastStep = function () {
                return step() === stepsLength - 1;
            }

            this.next = function () {
                if (this.isLastStep()) {

                    var vm = this.activeStep(); //.viewModel;

                    $.when(service.saveCreateSchoolyear({ schoolyearId: 1 })).done(function () {

                        app.trigger('savedTimeTable', { isSuccess: true });
                    }).fail(function (e) {

                        alert(e);
                    });

                }
                else if (step() < stepsLength) {
                    step(step() + 1);
                    self.activeStep(steps[step()]);
                }
            }

            this.previous = function () {
                if (step() > 0) {
                    step(step() - 1);
                    self.activeStep(steps[step()]);
                }
            }
        }
        return ctor;
    });
4

2 に答える 2

0

私はあなたの解決策に同意しますが、アプリケーション内のすべてのイベントを登録解除する原因となるため、パラメーターなしでプレーンな.off()を使用しないことをお勧めします。

代わりに、イベント名をパラメーターとして off メソッドに渡します。

self.createSubscribe().off('savedTimeTable');
于 2016-11-18T11:36:47.110 に答える
0

これは私を大いに助けました:

activator.deactivate 関数を使用すると、前のオブジェクトでカスタムの非アクティブ化ロジックを実行できます。"

SchoolyearDialog.js

self.deactivate = function () {
                 self.createSubscribe().off();
                self.editSubscribe().off();
}

schoolyearDialog が非アクティブ化されると、作成/編集ボタンがクリックされたかどうかに関係なく、両方のイベントが登録解除されます。これは私にとってはきれいな解決策です:)

于 2013-10-04T16:18:18.193 に答える