如果已经定义了视图模型,无论是手动还是使用映射插件自动定义,那么稍后使用原型在代码中"扩展"(添加属性/函数)视图模型是否有任何问题?
我知道映射插件的创建回调,我只想知道使用原型是否有任何影响?我问的原因是因为我从服务器端代码生成大部分视图模型,但有时需要比初始生成时更晚地扩展视图模型。
这没有任何问题,我使用一个大型的深度视图模型图,该图通过相应结构化的 JSON 中的映射插件实例化,我使用原型来定义具有有用属性的"抽象视图模型"和 toJSON"覆盖"等。
这没有问题。只需确保视图在视图模型中的特定字段中没有数据时视图会做出适当的响应。
似乎有几种方法可以解决这个问题。
首先,你可以采用单个对象视图模型,并通过原型扩展它们:
ko.utils.extend(ViewModelClass.prototype, {
newPrototype1: function () { ... },
newPrototype2: function () { ... }
}
或者,您可以添加一个扩展器来挖空并通过可观察对象本身调用它:(http://knockoutjs.com/documentation/extenders.html)
ko.extenders.numeric = function(target, precision) {
...details in link above...
}
...
self.NumericProperty = ko.observable(data).extend({ numeric: 0 });
...
或者创建一个函数,该函数可用于可观察、可观察数组、计算...(http://knockoutjs.com/documentations/fn.html)
ko.observable.fn.filterByProperty = function(propName, matchValue) {
return ko.computed(function() {
...details in link above...
}, this);
}
我倾向于使用这些的组合。我喜欢在与虚拟机和映射不同的文件中扩展视图模型的原型,所以我有一个这样的结构
- 视图模型.js
- 视图模型。映射.js
- 视图模型。原型.js
正如你将看到的,这些"答案"之间的时间跨度相当大,所以有些事情发生了变化,但有些事情保持不变。