“;“站点范围”;ViewModel变量

Design pattern for "site wide" ViewModel variables

本文关键字:ViewModel 变量 范围 站点 站点范围      更新时间:2023-09-26

我正在寻找一种智能设计模式,用于将站点范围的变量加载到项目中多个视图的ViewModel中(以DRY方式)。模糊的问题,一个例子可以澄清事情:

在我的项目中,我有一个局部视图,它显示来自客户端服务器的常规消息和错误消息。消息使用Knockout绑定进行绑定,如下所示:

<p class="message" data-bind="visible: (message.length > 0), text='message'"></p>

这意味着我必须在每个ViewModel中添加相同的代码:

viewModel.message = ko.observable("some message from server or none");

这不是干的!

如何以聪明的方式解决这个问题?对于这种情况,有什么明智的设计模式吗?

我已经知道几个"不太好的选择",所以请继续选择好的选择。:)

您可以使用apply扩展模型。可以使用其他扩展方法,但这对于Knockout ViewModels来说是简短而充分的。

jsFiddle

A和B都延伸Base。您可以在一个ViewModel上扩展多个类(或接口),任何扩展基的东西都可以获得其基的成员,等等

在这种情况下,我们的基地有一个error可观测。我们还可以为它提供一些与服务器交互的功能。

function Base(){
    var self = this;
    self.error = ko.observable('No Error');
}

A扩展了Base,并且可以在不定义错误的情况下访问错误

function A(){
    var self = this; Base.apply(self, arguments);
    self.greeting = ko.observable('Hello');
    // Change the error
    self.error('A has an error');
}

B还扩展了Base,但仅使用HTML中的可观察内容(请参阅fiddle)。

function B(){
    var self = this; Base.apply(self, arguments);
    self.data = new Date;
}
ko.applyBindings({
    a: new A,
    b: new B
});