我仍然在学习Knockout的正确用法,并且我发现自己在设置视图模型时很快就不再键入ko.observable
,而只是定义一个对象文字,并通过映射插件传递它,如下所示
var viewModel = ko.mapping.fromJS(data);
或者至少像这样将我的所有数据填充到viewModel上的一个属性中
var viewModel = {
... events etc ... ,
"data": ko.mapping.fromJS(data)
}
老实说,我这么做的主要原因是为了避免重复输入ko.observable
和ko.observableArray
。我只是想弄清楚这是不是一种好的方法,以及将特定的var x = ko.observable()
声明一起丢弃是否有任何缺点。另外,我是在加载的时候做这些事情的,而不是响应任何ajax调用等,据我所知,映射插件就是为此而设计的。
在您使用knockout的工作中,您是否仍然手动逐个声明可观察对象,还是使用我使用的mapping.fromJS方法?像这样频繁使用映射插件有什么特别的缺点吗?
编辑:
具体示例
In this article,史蒂夫通过以下方式设置他的viewModel
var initialData = [ { ... } , { ... } ]; // json from the serializer
var viewModel = {
gifts : ko.observableArray(initialData)
};
通常,我也会在这种情况下使用ko.mapping.fromJS
,特别是为了确保数组中的对象也被转换为可观察对象。看看他的所作所为,我的方法看起来有点夸张,并增加了一些不必要的开销。
发布于 2011-09-23 01:29:09
我给你的建议和我刚刚在https://stackoverflow.com/questions/7499133/mapping-deeply-hierarchical-objects-to-custom-classes-using-knockout-mapping-plug.回答的问题是一样的
您使用映射插件的理由是合理的,我也是这样做的。为什么要键入更多的代码呢?
在我使用knockout的经验中(总共4个月),我发现我手动做的越少,让knockout例程做他们自己的事情,我的应用程序似乎运行得越好。我的建议是先尝试最简单的方法。如果它不能满足你的需求,看看简单的方法是如何做它的“事情”的,并确定必须做出哪些改变来满足你的需求。
发布于 2012-06-22 15:37:36
艾伦,我最近在Knockout.js上的学习经历和你的相似。我们使用来自服务器的深层次对象图,并且我定义了显式的、可实例化的视图模型函数,这些函数保留了它的基本结构。
一开始,我将每个属性显式定义为相关视图模型上的一个可观察对象,但很快就失去了控制。此外,切换到使用映射插件的一个主要原因是,我们必须频繁地将图的Ajax post返回到服务器,在服务器上将其与持久化版本合并,然后在服务器上进行验证,以便可以更改大量属性和修改集合,并返回一个新的实例作为Ajax结果,其中它必须与客户端表示重新合并。这变得非常困难,映射插件通过允许指定标识符来解析添加/删除/更新,并将更新的图形重新映射到原始图形上,从而提供了很大的帮助。
它还通过使用子视图模型的"create“选项来帮助创建原始图形。在每个视图模型构造器中,我接收到对父视图模型的引用以及用于构造子视图模型的数据,然后创建进一步的映射选项,以便从传入的子视图数据创建孙子视图。
正如我最近在this question中详细描述的那样,我最近发现的唯一(轻微)缺点是,在执行ko.mapping.toJSON时,它不会挂钩到您可能在视图模型的原型上定义的任何toJSON覆盖,以便从序列化中排除属性。我已经能够通过在取消映射中指定忽略选项来解决这个问题,正如Ryan Niemeyer在那篇文章中所建议的那样。
所以总而言之,我肯定会坚持使用映射插件。Knockout.js规则。
发布于 2012-04-24 18:40:02
一个更简单但完整帮助的附加组件可以是knockout-data-projections
目前,它不能处理js到视图模型的映射,但它能很好地处理视图模型到JS的映射。
https://stackoverflow.com/questions/7488208
复制相似问题