用原型扩展淘汰视图模型

时间:2012-07-04 08:33:58

标签: javascript knockout.js prototype knockout-mapping-plugin

如果已经使用映射插件手动或自动定义了一个viewmodel,那么稍后在代码中使用原型“扩展”(添加属性/函数)viewmodel有什么问题吗?

我知道映射插件的创建回调,我只想知道是否有使用原型的含义?我问的原因是因为我从服务器端代码生成大部分视图模型,但有时需要在初始生成之后延长viewmodel。

3 个答案:

答案 0 :(得分:2)

我认为这没有任何问题,我使用来自相应结构化JSON的映射插件实例化的大型深视图模型图,我使用原型来定义具有有用属性的“AbstractViewModel”和toJSON“覆盖” “除其他外。

答案 1 :(得分:1)

这没有问题。当viewModel中的特定字段中没有数据时,只需确保视图响应正确。

答案 2 :(得分:1)

似乎有几种方法可以解决这个问题。

首先,您可以采用单个对象视图模型,并通过原型实现它们扩展它们:

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 });
...

或创建一个可用于observable,observableArray的所有实例的函数,计算... (http://knockoutjs.com/documentations/fn.html

ko.observable.fn.filterByProperty = function(propName, matchValue) {
    return ko.computed(function() {    
        ...details in link above...
    }, this);
}

我倾向于使用这些的组合。我喜欢在虚拟机和映射的单独文件中扩展View Models的原型,所以我有一个像

这样的结构
  • ViewModel(s).js
  • ViewModel(s).Mappings.js
  • 视图模型(一个或多个).Prototypes.js

正如您所看到的,这些“答案”之间的时间间隔相当大,所以有些事情发生了变化,但有些事情保持不变。