1

如果已经定义了视图模型,无论是手动还是使用映射插件自动定义,那么稍后在代码中使用原型“扩展”(添加属性/功能)视图模型是否有任何问题?

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

4

3 回答 3

2

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.

于 2012-07-04T09:55:39.960 回答
1

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

一方面,您可以采用单个对象视图模型并通过原型 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(s).js
  • ViewModel(s).Mappings.js
  • ViewModel(s).Prototypes.js

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

于 2013-10-31T16:43:47.497 回答
1

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

于 2012-07-05T18:58:15.983 回答