【问题标题】:Why add properties/methods to viewmodel AFTER definition?为什么在定义后向视图模型添加属性/方法?
【发布时间】:2014-08-14 09:04:49
【问题描述】:

在向我的基于 durandal 的应用程序添加身份验证时,我正在使用示例项目 (durandal541) 作为参考。在其中我注意到大多数页面的视图模型中,程序员都这样做了:

        // Reveal the bindable properties and functions
        var vm = {
            activate: activate,
            goBack: goBack,
            title: 'manage',
            session: session,
            userName: ko.observable(),
            logins: ko.observableArray(),
            localLoginProvider: ko.observable(),
            externalLoginProviders: ko.observableArray(),
            message: ko.observable()
        };

        vm.hasLocalPassword = ko.computed(function () {
            var logins = vm.logins();

            for (var i = 0; i < logins.length; i++) {
                if (logins[i].loginProvider() === vm.localLoginProvider()) {
                    return true;
                }
            }

            return false;
        });

        vm.changePassword = ko.computed(function () {
            if (!vm.hasLocalPassword()) {
                return null;
            }

            return new ChangePasswordViewModel(vm, vm.userName());
        });
        ...

将“hasLocalPassword”和“changePassword”添加到刚刚定义的“vm”视图模型而不是这样做,在定义时将它们作为视图模型的一部分包含在内,有什么意义/好处?:

        // Reveal the bindable properties and functions
        var vm = {
            activate: activate,
            goBack: goBack,
            title: 'manage',
            session: session,
            userName: ko.observable(),
            logins: ko.observableArray(),
            localLoginProvider: ko.observable(),
            externalLoginProviders: ko.observableArray(),
            message: ko.observable(),
            hasLocalPassword = ko.computed(function () {
                var logins = vm.logins();

                for (var i = 0; i < logins.length; i++) {
                    if (logins[i].loginProvider() === vm.localLoginProvider()) {
                        return true;
                    }
                }

                return false;
            }),
            changePassword = ko.computed(function () {
                if (!vm.hasLocalPassword()) {
                    return null;
                }

                return new ChangePasswordViewModel(vm, vm.userName());
            })
        };

【问题讨论】:

    标签: javascript viewmodel single-page-application durandal


    【解决方案1】:

    啊。现在我明白了。正如 Ryan Niemayer 在这段视频中 10:45 所解释的那样! http://vimeo.com/51103092

    这个问题可能会被删除,但以防万一其他菜鸟想知道 - 简单的答案是 ko.computeds 被评估立即(当然,除非你添加了 deferred 选项)和这意味着如果在视图模型本身(根据我的第二个示例)中定义,在这种情况下任何引用“vm”视图模型的计算都将在启动时失败,因为 vm 在那一刻根本不存在!因此,在第一个示例中的初始定义之后,将计算结果添加到定义的视图模型对象中。

    【讨论】:

    • 你帮了自己 ;-)
    • 你为什么要删除这个问题?
    • 我不打算这样做,只是假设模组会这样做!
    猜你喜欢
    • 2015-04-22
    • 2015-12-01
    • 2020-11-23
    • 1970-01-01
    • 2019-03-25
    • 2011-11-23
    • 2015-04-05
    • 2021-02-04
    • 2011-02-18
    相关资源
    最近更新 更多