如果已经定义了视图模型,无论是手动还是使用映射插件自动定义,那么稍后在代码中使用原型“扩展”(添加属性/功能)视图模型是否有任何问题?
我知道映射插件的创建回调,我只想知道使用原型是否有任何影响?我问的原因是因为我从服务器端代码生成大部分视图模型,但有时需要在初始生成之后扩展视图模型。
如果已经定义了视图模型,无论是手动还是使用映射插件自动定义,那么稍后在代码中使用原型“扩展”(添加属性/功能)视图模型是否有任何问题?
我知道映射插件的创建回调,我只想知道使用原型是否有任何影响?我问的原因是因为我从服务器端代码生成大部分视图模型,但有时需要在初始生成之后扩展视图模型。
I don't think there is any problem with this, I work with a large deep view model graph instantiated via the mapping plugin from correspondingly structured JSON and I use prototypes to define an "AbstractViewModel" with useful properties and toJSON "overrides" among other things.
似乎有几种方法可以解决这个问题。
一方面,您可以采用单个对象视图模型并通过原型 utils.extend 它们:
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);
}
我倾向于使用这些的组合。我喜欢在独立于虚拟机和映射的文件中扩展视图模型的原型,所以我有一个类似的结构
正如您将看到的,这些“答案”之间的时间跨度相当大,所以有些事情发生了变化,但有些事情保持不变。
这没有问题。只需确保当 viewModel 中的特定字段中没有数据时视图会正确响应。