knockout.js - knockoutjs 子对象触发父计算中的更改

标签 knockout.js parent subscribe computed-observable

有没有更简单的方法让父对象的“订阅”随着任何较低级别的可观察对象的变化而触发?

下面的代码和示例 fiddle 正在运行,但它需要我在 optionSet 中复制我的 masterOptions。这个较小的版本是易于管理的,但我的 masterOptions 集可能会变得非常大,这将使 masterOptions 和 optionSet 的维护变得困难且容易出错。

在此处找到示例 jsfiddle:fiddle

html:

<div>
    Setting1a: <input data-bind="value: masterOptions.group1.setting1a" /><br />
    Setting1b: <input data-bind="value: masterOptions.group1.setting1b" /><br />
    Setting2a: <input data-bind="value: masterOptions.group2.setting2a" /><br />
    Setting2b: <input data-bind="value: masterOptions.group2.setting2b" /><br />
    <br />
    span1: <span data-bind="text: ko.toJSON(optionSet)"></span><br/>
    <br />
    span2: <span id="mySpan"></span>
</div>

脚本:

var masterOptions = {
    group1: {
        setting1a: ko.observable("value1a"),
        setting1b: ko.observable("value1b")
    },
    group2: {
        setting2a: ko.observable("value2a"),
        setting2b: ko.observable("value2b")
    }
};
var optionSet = ko.computed(function () {
    return {
        group1: {
            setting1a: masterOptions.group1.setting1a(),
            setting1b: masterOptions.group1.setting1b()
        },
        group2: {
            setting2a: masterOptions.group2.setting2a(),
            setting2b: masterOptions.group2.setting2b()
        }
    };
});
optionSet.subscribe(function () {
    //alert("Make some magic happen.");
    $("#mySpan").html($("#mySpan").html() + "more magic. ");
});
var ViewModel = function () {
    return {
        masterOptions: masterOptions,
        optionSet: optionSet
    };
};

ko.applyBindings(new ViewModel());

我宁愿不必将 masterOptions 重新创建为 optionSet,但我不明白当任何较低级别的可观察量发生变化时我如何才能触发单个订阅。

最佳答案

在你的 computed 中调用 masterOptions 上的 ko.toJS 就可以了:

var optionSet = ko.computed(function () {
    return ko.toJS(masterOptions);
});

[ jsfiddle ]

这会创建对结构中每个可观察对象的依赖。此外,添加到其中的任何可观察对象都将作为依赖项包含在内。

但是,如果您想直接订阅 masterOptions 和/或需要更大的灵 active ,您可以考虑使用我自己编写的这个方便的小插件,目的几乎相同:

https://github.com/ZiadJ/knockoutjs-reactor

关于knockout.js - knockoutjs 子对象触发父计算中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705618/

相关文章:

C# 如何从父列表访问继承的对象

angular - 编写更清洁的 Promise 完成闭包

continuations - 使用 .NET Reactive 将延续链接在一起

javascript - 如何使用 Knockout JS 或其他方式将选择框的选定文本绑定(bind)到对象的属性?

javascript - 根据其他选择列表中的选择重置(空)knockout.js 选择列表

javascript - Knockoutjs 找不到匹配的结束评论标签

r - 将字符列表传递到 R 中的 file.path

javascript - knockoutJS、requireJS 和 jQueryUI Datepicker 不能一起玩

html - 仅适用于具有特定父项的 tr

javascript - 如何从 Angular 中的 http/async 调用为接口(interface)属性赋值?