$ parent.inState不是Knockout JS的函数错误

时间:2012-01-19 14:04:15

标签: javascript knockout.js undefined

我正在使用命名模板并将数据列表绑定到该模板。绑定工作得很好,但我在$ parent.inState()调用时收到错误。看下面的示例:

<div data-bind="template: { name: 'peopleScript', data: people }"> </div>

<script id="peopleScript" type="text/html">
    <ul data-bind="foreach: people">
        <li>
            Name: <span data-bind="text: name"> </span>
            State: <span data-bind="{ text: state, css: { outOfState: !$parent.inState($data) } }"> </span>

            <span data-bind="visible: ($parent.inState($data))">
                In State
            <span>

            <a href="#" data-bind="click: $parent.removePerson">Remove</a>
        </li>
    </ul>
    <button data-bind="click: addPerson">Add</button>
</script>

它说$parent.inState不是一个功能。我也尝试了$parents,但无济于事。我知道应用绑定工作的代码;如果我只是内联模板,它的效果很好。我也知道其他一切设置正常,它可以正常访问该方法。所以它只是由于某种原因无法找到inState。

任何想法为什么?

感谢。

1 个答案:

答案 0 :(得分:2)

当您将data作为人传递时,您希望在foreach$data(除非您的结构真的是people.people

你可以这样做:

<div>
  <ul data-bind="template: { name: 'peopleScript', foreach: people }"></ul>
</div>

只需在模板中使用li或使用当前结构,在foreach上执行$data

inState的问题是template创建了一个范围,然后foreach绑定创建了另一个范围。所以,当你在里面时,你必须上两个范围。您可以使用$parents[1]来完成此操作:http://jsfiddle.net/rniemeyer/RNWML/或者如果它确实位于顶层,那么使用$root是最简单的选择,例如:http://jsfiddle.net/rniemeyer/RNWML/2/