应用程序视图模型

Application ViewModel

应如何在 Durandal 应用程序中管理应用程序范围的数据?

比如用户登录后,我需要持久化UserName和UserId

我试过的是创建一个单例视图模型,然后在需要的地方导入它。

define(['knockout'], function (ko) {
return {
    currentUser: ko.observable(),    
};
});

这是与 Durandal 一起使用的正确模式吗?

我找到了一个更好的答案,那就是使用 Durandal 内置的 events。这很好用。

这是使用事件进行身份验证的工作示例:

//app/auth.js
'use strict';

define(function (require) {
    var
        ko = require('knockout'),
        User = require('auth/model/user'),
        api = require('auth/api'),
        events = require('durandal/events'),

        guestUser = new User({id: null}),
        currentUser = ko.observable(guestUser),

        signedIn = ko.computed(function () {
            return ko.unwrap(currentUser().id) !== null;
        }),

        load = function () {
            return api.getUser().then(function (dto) {
                var user = User.mapper.fromDto(dto);
                currentUser(user);

                return user;
            });
        },

        signIn = function (username, password, remember) {
            var that = this;
            return api.signIn(username, password, remember)
                .then(function (data) {
                    var user = User.mapper.fromDto(data);
                    currentUser(user);

                    that.trigger('signin:success', user);

                    return user;
                }, function (reason) {
                    that.trigger('signin:failure', reason);

                    throw reason;
                });
        },

        signOut = function () {
            var that = this;
            currentUser(guestUser);

            return api.signOut().then(function () {
                that.trigger('signout:success');
            });
        };

    return {
        load: load,
        signIn: signIn,
        signedIn: signedIn,
        signOut: signOut,
        currentUser: currentUser
    }
});

//main.js

define(function (require) {
   var auth = require('auth'),
       events = require('durandal/events'); 

   events.includeIn(auth);
});


//mysecuremodule.js

define(function (require) {
   var auth = require('auth');

   auth.on('signin:success').then(function (user) {
     //hello signed in user!
    });
});