用于修改从子视图模型在父视图上可观察到的删除的模式
Pattern for modifying knockout observable on parent from child view model
我已经设置了父子视图模型对象结构,需要从子对象更新父对象上的可观察对象。我基本上已经想出了两种模式:
1] 将父属性的引用传递给子属性,并从子属性中更新属性:
var ParentViewModel = function(){
var self = this;
this.selectedItem = ko.observable();
this.child = ko.observable(new ChildViewModel(self.selectedItem));
}
var ChildViewModel = function(parentSelectedItem){
var self = this;
this.id = ko.observable();
this.parentSelectedItem = parentSelectedItem;
this.select = function(){
self.parentSelectedItem(self);
}
}
2] 在父对象上创建子对象的选择方法,并引用本地可观察到的父对象:
var ParentViewModel = function(){
var self = this;
this.selectedItem = ko.observable();
var child = new ChildViewModel();
child.select = function(){
self.selectedItem(child);
}
this.child = ko.observable(child);
}
var ChildViewModel = function(){
this.id = ko.observable();
}
这两种图案都没有让我大吃一惊。第一个将整个属性引用推送到子视图模型中,第二个在子视图模型的范围之外定义子函数。
关于如何在javascript中以干净和可测试的方式实现此操作,有人有其他模式建议吗?还是我或多或少地被这两个选项卡住了?
Knockout中最常见的模式是在您的父级上放置一个"selectChild"方法来接收子级。在大多数情况下,实际的子对象不需要知道它正在被选中。
然后在绑定中,可以绑定到$root.selectChild
或$parent.selectChild
。传递给绑定到click/event绑定的处理程序的第一个参数是实际数据(在KO 2.0中),因此您的方法可以在父对象上运行,并将子对象作为第一个参数接收。
var Item = function(id, name) {
this.id = id;
this.name = ko.observable(name);
};
var ViewModel = function() {
var self = this;
this.items = ko.observableArray([
new Item(1, "one"),
new Item(2, "two"),
new Item(3, "three")
]);
this.selectedItem = ko.observable();
this.selectItem = function(item) {
self.selectedItem(item);
};
};
在这种情况下,您的绑定看起来像:
<ul data-bind="foreach: items">
<li>
<a href="#" data-bind="text: name, click: $root.selectItem"></a>
</li>
</ul>
在jsFiddle中:http://jsfiddle.net/rniemeyer/anRsA/
你甚至可以进一步简化它。Observable是函数,您传递给它们的第一个参数用于设置它们的值,因此您甚至可以选择不包括selectItem
方法,而直接绑定$root.selectedItem
(看起来像:http://jsfiddle.net/rniemeyer/anRsA/1/)。我通常使用一个单独的方法来显式,给它一个合适的名称(操作),以防在设置项目之前或之后需要进行额外的处理。
在KO 2.0之前(其中引入了$root
和$parent
,并将数据作为第一个arg传递给click
和event
处理程序),我曾经使用您建议的第一种方法。实际上,您可以在那里做的一件事是不创建子属性(this.parentSelectedItem
),而是直接在select
方法中引用parentSelectedItem
(作为参数传递),因为它将在函数中可用,因为创建了闭包。
- knockoutjs可观察数组
- 如何使用javascript从主svg对象动态创建svg视图框
- 正在使用$location.path(.)路由ng视图
- angular.js没有'无法在PhoneGap中处理视图标记
- 如何包含特定于每个视图angularjs的javascript文件
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 敲除可观察数组并没有更新从数组中移除元素的视图
- Ember.js 如何使用视图观察选区更改 Ember.Select multiple=true
- KnockoutJs 更新视图模型可从 Json Web 服务中观察到
- 可由其他视图模型访问的挖空可观察/视图模型
- PUT 期间不包括视图模式可观察属性
- Knockoutjs:如何将单个项目从可观察数组传递到我的视图模型中
- 用于修改从子视图模型在父视图上可观察到的删除的模式
- 从另一个视图模型观察KO可观察对象
- knockoutjs:计算级联数组(复杂视图模型)中的可观察性和this指针
- 视图中未更新的可观察对象的设置值
- 具有两个视图模型的依赖可观察对象
- 淘汰组件更新未被父视图模型订阅的可观察对象