试图理解为什么绑定到嵌套的viewmodel失败

时间:2013-07-17 14:30:59

标签: knockout.js

我有两个ViewModel(虽然我喜欢将'Person'ViewModel视为模型):

function Person() {
    var self = this;
    self.firstName = ko.observable("");
    self.lastName = ko.observable("");
}


function AppViewModel() {
    var self = this;
    self.admin = ko.observable(null);
    self.something = ko.observable("Hello World");
}

然后我将AppViewModel.admin设置为Person的实例:

var viewModel = new AppViewModel();

var bob = new Person();
bob.firstName("Sponge");
bob.lastName("Bob");
viewModel.admin(bob);

ko.applyBindings(viewModel);

然后我尝试像这样绑定它:

<p><strong data-bind="text: admin.firstName"></strong></p>
<p><strong data-bind="text: admin.lastName"></strong></p>
<p><strong data-bind="text: something"></strong></p>

我希望这个输出是:

  

海绵
  的鲍勃
   Hello World

然而事实并非如此,输出只是“Hello World” (显然'某事'只是AppViewModel的一个可观察者,因此该部分有效)

有人可以解释为什么它不起作用而我应该做什么呢?

关于jsFiddle的完整示例:http://fiddle.jshell.net/XRPAH/1/

2 个答案:

答案 0 :(得分:2)

“admin”是一个可观察的,所以你需要“调用它”来访问所包含的值:

<p><strong data-bind="text: admin().firstName"></strong></p>

实际上,如果你这样做

data-bind="text: something"

这只是

的简写
data-bind="text: something()"

但是如果observable是admin.firstName等表达式的一部分,则需要明确写下括号。

答案 1 :(得分:1)

您的对象admin是可观察的,因此您需要使用()

来访问它

例如:

<p><strong data-bind="text: admin().firstName"></strong></p>

和html第一行中的相同,应该是这样的

<p><strong data-bind="text: admin().firstName() + ' '+ admin().lastName()"></strong>
</p>

请检查此 Working Demo