如何使用Knockout访问绑定对象实例的属性

时间:2014-01-29 15:12:37

标签: data-binding knockout.js

我无法弄清楚如何获取绑定项的属性。当.name()存在时,以下内容不起作用。

<span data-bind='text: selectedMenuSection().name()'></span>

似乎无法访问data-bind中绑定对象的属性。相同的语法适用于模型函数MenuViewModel.showSelection()。我已经尝试了所有可想到的语法但没有成功。以下是我的代码的摘录。

HTML

MenuSections: <select data-bind="options: leftMenu, optionsText: 'name', value: selectedMenuSection, optionsCaption: 'Pick...'"> </select>

Selected: <span data-bind='text: selectedMenuSection().name()'></span>

<button data-bind="click: showSelection">Show Selected Info</button>

的javascript

 function MenuViewModel (menu) {
  var self = this;
  self.leftMenu = ko.observableArray(menu);

  //Bound to Select
  self.selectedMenuSection = ko.observable();

  self.showSelection = function(){
    alert(self.selectedMenuSection().name());
  };
};

是否无法获取数据绑定对象属性或者我还没弄明白该怎么做?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

<span data-bind="with: selectedMenuSection">
    <span data-bind="text: name"></span>
</span>

第一行确保仅在selectedMenuSection不为null或未定义时才存在内部跨度(当您创建self.selectedMenuSection时,其值未定义,这可能会在尝试访问name属性时导致错误)。第二行是您的原始绑定。最后你不需要(),因为你绑定了observable(你只需要()来访问observable的当前值,或者如果你绑定一个复杂的语句而不是直接绑定一个可观察的。)

答案 1 :(得分:0)

MenuSection是什么样的?我假设它有一个不是可观察的名称属性。汉斯的答案是解决问题的正确方法。理解javascript对象并了解在编写敲除时你所处的“上下文”html非常重要。

with binding将上下文从根元素(传递给ko.applyBindings的对象)更改为selectedMenuSection的上下文。因此,在'with'你的上下文(在所有情况下为$ data)中都是一个MenuSection。如果你对上下文中的对象感到好奇,你可以这样做:

    <div data-bind="with: selectMenuSection">
        <pre data-bind="text: ko.toJSON($data)></pre>
        <span data-bind="text: name"></span>
    </div>

这将打印出您所在的当前对象上下文。然后您将能够看到您有一个“name”属性以及与MenuSection相关的任何其他内容。