1

我有一个具有对象层次结构的 Knockout 应用程序。如果我想访问 HTML 标记中对象的深层,我会使用类似的东西:

data-bind="text: property1().property2().property3()"

我想在纯 Javascript 中订阅相同的目标,即每当 property3 在当前绑定的对象上发生更改时执行一个函数,或者每当层次结构更改为 property3 以下时执行一个函数。换句话说,我想做类似的事情:

myviewmodel.deepSubscribe("property1().property2().property3()", function() { .... });

在淘汰赛中我该如何处理?

4

3 回答 3

5

最好使用computed淘汰赛功能。

您可以声明:

var computedProp = ko.computed(function(){
    return property1().property2().property3();
}

然后你可以像这样绑定:

data-bind="text: computedProp"

您可以像这样订阅它:

computedProp.subscribe(function() { .... });
于 2013-11-06T12:26:28.387 回答
2

在最简单的情况下,您只需直接订阅property3. 假设一个视图模型是这样的:

var reality = {
    dreamLevel1: ko.observable({
        dreamLevel2: ko.observable({
            dreamLevel3: ko.observable("some value")
        })
    })
};

然后,您可以订阅一些普通的 javascript 来更改 property3,如下所示:

reality.dreamLevel1().dreamLevel2().dreamLevel3.subscribe(function(newVal) {
    document.getElementById('proofOfConcept').innerHTML += "\n" + newVal
});

有关我的意思的演示,请参阅this fiddle 。

当然,如果property2property1更改,您需要重新订阅。您可以分解出要在订阅上执行的代码:

function lvl3Subscription(newVal) {
    document.getElementById('proofOfConcept').innerHTML += "\n" + newVal
}

然后直接订阅这个初始的 3 级属性:

reality.dreamLevel1().dreamLevel2().dreamLevel3.subscribe(lvl3Subscription);

以及 2 级属性:

reality.dreamLevel1().dreamLevel2.subscribe(function(newDream) {
    newDream.dreamLevel3.subscribe(lvl3Subscription); 
});

等等。现在,如果级别 2 发生更改,因此级别 3 变得完全不同,自定义 Javascript 代码仍将订阅新的级别 3 observable。

在更新的小提琴中看到这一点。

于 2013-08-12T21:10:12.090 回答
2

为此,我在这里写了 Knockout Reactor:

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

它在深度订阅分层模型方面做得很好,并提供了很大的灵活性。

于 2014-05-17T11:55:40.587 回答