我有一个包含3个逻辑部分的编辑页面:
允许用户一次编辑每个部分,并使用一个提交按钮提交更改。
就功能和用户正在编辑的对象而言,此页面很大。
发送到页面进行编辑的对象是一个JSON对象,具有一些未编辑但需要在提交时传递回的属性。
在这种情况下,最佳做法是具有以下VM结构:
我会将每个VM分配到页面的适当部分。将更改合并回主JSON对象以使我可以仅将一个对象提交到服务器的最简单方法是什么?
页面拆分看起来很合逻辑,它本身不应该是一个问题。但是,您如何进行操作有不同的方法,这给他们带来了挑战。
就像您建议的那样,“简单”的出路将是拥有带有子视图模型的树状主视图。我记得当我在一两年前开始使用Knockout时,这是推荐的方法。在香草JS中,您将获得类似以下内容的信息:
function childVM() { this.prop = ko.observable(0); }
function masterVM() {
this.children = ko.observableArray([new childVM(), new childVM()]);
}
但是您也可以使用(甚至更确切地说)使用ko.components
,毕竟,它专门用于将大型代码分解为模块的目的(并与RequireJS一起很好地工作)。(通过这种方式,您可以将组件彼此嵌入,尽管确实使它们相互依赖)。使用先前代码的组件示例:
ko.components.register('child', {
viewModel: function childVM(params) { this.prop = ko.observable(0||params.number)},
template: { element: 'child' }); //looks for tmpl with id 'child'
function masterVM() {
this.children = ko.observableArray([new childVM(), new childVM()]);
}
通过这种方法,您还可以使用自定义元素,例如:<child params='{number: 4}></child>
。本质上,组件的工作方式与普通方法相同,不同之处在于它们是通过视图绑定到父对象的,而不是通过viewModel显式绑定的。下一步,将使子模型或组件能够相互通信,将使用发布订阅系统。详情请参阅这里:http : //www.knockmeout.net/2012/05/using-ko-native-pubsub.html
之后,要从不同的视图模型中获取数据,submit
就像ko.mapping.toJS
在每个子模型上使用调用一样简单(使用映射插件,它将所有可观察对象转换为常规JS),将它们组合在一起,字符串化为JSON并发送。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句