"网站范围内的设计模式" ViewModel变量

时间:2013-07-08 12:17:22

标签: javascript design-patterns knockout.js

我正在搜索一个智能设计模式,用于将站点范围的变量加载到项目中的多个视图的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");

这不是干!

如何以智能方式解决这个问题?在这种情况下,是否有任何智能设计模式?

我已经知道了一些“不太好的选择”,所以请保持良好的选择。 :)

1 个答案:

答案 0 :(得分:0)

您可以使用apply扩展模型。可以使用其他扩展方法,但这对于Knockout ViewModel来说很短且足够。

jsFiddle

A和B都扩展了Base。您可以在一个ViewModel上扩展多个类(或接口),并且扩展基础的任何内容也可以获得其基础的成员,依此类推。

在这种情况下,我们的Base有一个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中的observable(请参阅小提琴)。

function B(){
    var self = this; Base.apply(self, arguments);

    self.data = new Date;
}

ko.applyBindings({
    a: new A,
    b: new B
});