Knockout.js 从子视图中的复选框更改访问父视图模型
我有以下视图,它呈现子视图的两个副本,正如您所看到的,它们绑定到父视图模型上的两个属性Knockout.js 从子视图中的复选框更改访问父视图模型,knockout.js,Knockout.js,我有以下视图,它呈现子视图的两个副本,正如您所看到的,它们绑定到父视图模型上的两个属性 <div class="row"> <div class="col-sm-4" data-bind="with: primaryPerson"> <h5 data-bind="visible: $root.isMirror">You</h5> @{Html.RenderPartial("_PropertyQuestion
<div class="row">
<div class="col-sm-4" data-bind="with: primaryPerson">
<h5 data-bind="visible: $root.isMirror">You</h5>
@{Html.RenderPartial("_PropertyQuestionnaire");}
</div>
<div class="col-sm-4" data-bind="visible: isMirror, with: secondaryPerson">
<h5 data-bind="visible: $root.isMirror">Your partner</h5>
@{Html.RenderPartial("_PropertyQuestionnaire");}
</div>
</div>
下面是绑定到上述两个重复视图的PersonViewModel
function PersonViewModel(){
var self = this;
self.ownsMainHome = ko.observable(false);
self.ownsOtherProperty = ko.observable(false);
}
可观察的ownsMainHome
绑定到重复视图中的两个复选框之一。当其中任何一个发生更改时,我需要调用父视图模型中的函数mainHomeChanged
我读过关于淘汰赛的书,但我不确定我只是把它复杂化了
我尝试在子视图模型上扩展ownsMainHome
的可观察性:
self.ownsMainHome = ko.observable(false).extend({addHomeAddress:true});
及
console.log
是我试图定位bindingcontext的地方!我也试过了
ko.extenders.addHomeAddress = function (target, option) {
target.subscribe(function (newValue) {
console.log(ko.contextFor(target));
});
return target;
}
当然,target
是一个表示订阅者的对象,而不是绑定
所以我有点困了。有很多方法可以解决这个问题。以下是三种解决方案: 您可以使用订阅更改事件并调用您的方法:
<input type="checkbox" data-bind="checked: ownsMainHome,
event: { change: $parent.mainHomeChanged }" />
在您的PersonViewModel中
function PersonViewModel(parent){
var self = this;
self.ownsMainHome = ko.observable(false);
self.ownsOtherProperty = ko.observable(false);
self.ownsMainHome.subscribe(parent.mainHomeChanged);
}
演示
或者,您可以直接从您的MainViewModel
订阅:
self.primaryPerson = new PersonViewModel();
self.secondaryPerson = new PersonViewModel();
self.mainHomeChanged = function(){
alert('mainHomeChanged');
}
self.primaryPerson.ownsMainHome.subscribe(self.mainHomeChanged);
self.secondaryPerson.ownsMainHome.subscribe(self.mainHomeChanged);
演示。ha,这是我丢失的一个可观察对象上的
subscribe
方法。谢谢
<input type="checkbox" data-bind="checked: ownsMainHome,
event: { change: $parent.mainHomeChanged }" />
self.mainHomeChanged = function(){
alert('mainHomeChanged');
}
self.primaryPerson = new PersonViewModel(self);
self.secondaryPerson = new PersonViewModel(self);
function PersonViewModel(parent){
var self = this;
self.ownsMainHome = ko.observable(false);
self.ownsOtherProperty = ko.observable(false);
self.ownsMainHome.subscribe(parent.mainHomeChanged);
}
self.primaryPerson = new PersonViewModel();
self.secondaryPerson = new PersonViewModel();
self.mainHomeChanged = function(){
alert('mainHomeChanged');
}
self.primaryPerson.ownsMainHome.subscribe(self.mainHomeChanged);
self.secondaryPerson.ownsMainHome.subscribe(self.mainHomeChanged);