使用with
绑定时,您必须记住它会更改您当前所在的绑定上下文。
现在,坦率地说,您的模型有一个非常奇怪的设置,因为它的行为更像一个可观察工厂,生产可观察对象而不是包含可观察对象。
如果我们将您的模型更改为更传统的方法,如下所示:(这个例子很容易说明您在哪里走错了路)
模型:
var viewModel = function(data){
var self = this;
self.Test = ko.observable();
self.load = function(data) {
if (data) {
self.Test({ name: ko.observable(data.name) });
}
};
self.load(data);
};
var data = { name: 'Matt' };
ko.applyBindings(new viewModel(data));
html:
<!-- Once inside this markup, the scope changes to the things contained
inside of Test(). Therefore your aliasing needs to look like the following -->
<div data-bind="with: Test">
<div data-bind="text: name"></div>
<input data-bind="value: name, valueUpdate: 'afterkeydown'"></input>
</div>
JsFiddle:
这是一个jsfiddle来演示这个例子
解释:
请务必注意有关 with 绑定的文档:
with 绑定创建一个新的绑定上下文,以便将后代元素绑定在指定对象的上下文中。
...
with 绑定将根据关联值是否为空/未定义动态添加或删除后代元素
这个斜体部分解释了为什么在我的示例中使用 With 绑定不会因为 observableTest()
为 null 或 undefined 而引发错误;框架通过动态删除所有后代元素来处理这种情况。这在我的 jsfiddle 中得到了证明。
另请注意,我为属性内的对象提供了一个名为的属性name
,以便我可以显式绑定到它。如果您在属性本身上使用 with 绑定,您会遇到一些尝试将其作为属性绑定的技巧,因此您最好只拥有显式属性 IMO。
希望这会有所帮助