使用ko.applyBindingsToNode

Thi*_*hel 2 knockout.js

在这个小提琴https://jsfiddle.net/8279akmL/11/中,我试图将“ test”元素绑定到名为currentPlaceViewModel中可观察到的变量。我正在使用以下敲除语句:

ko.applyBindingsToNode(document.getElementById("test"),{text: currentPlace().name});
Run Code Online (Sandbox Code Playgroud)

但是,div绑定到列表项locations[0](绑定时currentPlace指向的项)而不是列表currentPlace本身。

当我更新currentPlace以指向其他列表项时locations[1]div不会更新。

在示例中,div当我更改时,唯一的更新是将其locations[0]更改为“ FOOBAR”。

如何将'div'绑定到currentPlace而不是locations[0]

Mic*_*est 7

为了使淘汰赛能够更新绑定,它需要知道要观察哪些可观察对象。在您的代码中,您只是将name可观察对象传递给绑定。它对currentPlace可观察对象一无所知,因为它在调用之前已被展开ko.applyBindingsToNode。您的代码等效于:

var theObservable = currentPlace().name;
ko.applyBindingsToNode(document.getElementById("test"), {text: theObservable});
Run Code Online (Sandbox Code Playgroud)

有两个选项可以解决此问题:1)创建一个返回正确名称的pureComputed,或2)用于ko.applyBindingAccessorsToNode将获取名称的整个逻辑传递给Knockout。这是您的示例更新为使用后一种方法:

ko.applyBindingAccessorsToNode(
    document.getElementById("test"), 
    { text: function() {return currentPlace().name} });
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/8279akmL/12/