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);