knockout.js - 从 subview 中的复选框更改访问父 View 模型

标签 knockout.js

我有以下 View ,它呈现 subview 的 2 个副本,如您所见,它们绑定(bind)到父 View 模型上的 2 个属性。

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

那个重复 View 非常简单,只有 2 个复选框绑定(bind)到 subview 模型上的属性

<div class="checkbox">
    <label>
        <input type="checkbox" data-bind="checked: ownsMainHome">
        Main home
    </label>
</div>
<div class="checkbox">
    <label>
        <input type="checkbox" data-bind="checked: ownsOtherProperty">
        Other properties
    </label>
</div>

这里是上面使用的简化 View 模型,首先是父 View ,绑定(bind)到顶 View

function MainViewModel(){
    var self = this;
    self.primaryPerson = new PersonViewModel();
    self.secondaryPerson = new PersonViewModel();

    self.mainHomeChanged = function(){
        // My question (i'll get to it!!) Is about this method
    }
}

这里是绑定(bind)到上面两个重复 View 的 PersonViewModel

function PersonViewModel(){
    var self = this;

    self.ownsMainHome = ko.observable(false);
    self.ownsOtherProperty = ko.observable(false);
}

可观察的 ownsMainHome 绑定(bind)到重复 View 中的 2 个复选框之一。当它们中的任何一个发生变化时,我需要在父 View 模型中调用函数 mainHomeChanged

我读过关于 knockout 的文章 extenderscustom bindings但我不确定我只是把它复杂化了。

我尝试在 subview 模型上扩展 ownsMainHome 的可观察对象:

self.ownsMainHome = ko.observable(false).extend({addHomeAddress:true});

ko.extenders.addHomeAddress = function (target, option) {
    target.subscribe(function (newValue) {
        console.log(target);
        console.log(this);
    });
    return target;    
}

console.log 是我定位绑定(bind)上下文的尝试!我也试过了

 ko.extenders.addHomeAddress = function (target, option) {
    target.subscribe(function (newValue) {
        console.log(ko.contextFor(target));
    });
    return target;    
}

当然 target 是代表订阅者的对象,而不是绑定(bind)。

所以我有点卡住了。

最佳答案

有很多方法可以解决这个问题。这是三个解决方案:

您可以使用 event binding订阅更改事件并调用您的方法:

<input type="checkbox" data-bind="checked: ownsMainHome, 
                                  event: { change: $parent.mainHomeChanged }" />

演示 JSFiddle .

您可以将 MainViewModel 传递给您的 PersonViewModel:

self.mainHomeChanged = function(){
    alert('mainHomeChanged');
}

self.primaryPerson = new PersonViewModel(self);
self.secondaryPerson = new PersonViewModel(self);

在你的 PersonViewModel

function PersonViewModel(parent){
    var self = this;

    self.ownsMainHome = ko.observable(false);
    self.ownsOtherProperty = ko.observable(false);

    self.ownsMainHome.subscribe(parent.mainHomeChanged);
}

演示 JSFiddle .

或者您可以直接从您的 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);

演示 JSFiddle .

关于knockout.js - 从 subview 中的复选框更改访问父 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584793/

相关文章:

javascript - 不显示 'ko with'则显示不同的内容

javascript - PDFMAKE: 'Roboto-Regular.ttf' 仅在 GULP 之后在虚拟文件系统中找不到

javascript - 无法将选中设置为默认 - knockout 复选框

javascript - 是或否而不是 knockout 中的真或假

javascript - knockout.js 永远在 chrome 中渲染带有大数组的 html

javascript - 为什么 Knockout.js 数据绑定(bind)到 checkValue 会覆盖 observable?

javascript - 在 MVVM modelView 中进行初始化有意义吗?

javascript - KnockoutJS 不更新 dom - 与 Googlemaps api 交互

javascript - Knockout.js 选择值绑定(bind)到对象

knockout.js - 使用 pjax 时在 history.back() 上消失的 knockout.js 绑定(bind)