我正在搜索一个智能设计模式,用于将站点范围的变量加载到项目中的多个视图的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");
这不是干!
如何以智能方式解决这个问题?在这种情况下,是否有任何智能设计模式?
我已经知道了一些“不太好的选择”,所以请保持良好的选择。 :)
答案 0 :(得分:0)
您可以使用apply
扩展模型。可以使用其他扩展方法,但这对于Knockout ViewModel来说很短且足够。
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
});