knockout.js - $parent 绑定(bind)不能像我想的那样工作,为什么?

标签 knockout.js

我对 javascript knockout 中的 $parent 有疑问。

如果我有模型:

        var Person = function () {

        var self = this;

        self.person_Id = ko.observable(); 
        self.firstName = ko.observable(); 
        self.lastName = ko.observable(); 
        self.age = ko.observable(); 
        self.role = ko.observable(); 

        self.init = function (data) {

            self.person_Id(data.person_Id);
            self.firstName(data.firstName);
            self.lastName(data.lastName);
            self.age(data.age);
            self.role(data.role);
        };

    };

和集合

        var PersonCollection = function () {

        var self = this;

        self.ItemToEditOrToAdd = ko.observable(new Person());  

        self.persons = ko.observableArray();

        self.AddItem = function (item) {

            self.persons.push(item);


        };

    };

和html

                <div id="new" data-bind="with: PersonCollectionInstance.ItemToEditOrToAdd">

                <p>Firstname: <input type="text" data-bind="value: firstName"/></p>
                <p>Lastname: <input type="text" data-bind="value: lastName"/></p>
                <p>Age: <input type="text" data-bind="value: age"/></p>
                <p>Role: <input type="text" data-bind="value: role"/></p>
                <button data-bind="click: $parent.PersonCollectionInstance.AddItem">Add new</button>

            </div>

如果您查看 html,访问 AddItem 的自然方式是编写

<button data-bind="click: $parent.AddItem">Add new</button>

这是行不通的,因为 $parent 绑定(bind)让我进入了我的 AppVM,它是我的全能 View 模型,而不是返回到我的 PersonCollectionInstance。

这就是为什么我需要这样做:

 <button data-bind="click: $parent.PersonCollectionInstance.AddItem">Add new</button>

谁能向我解释为什么 $parent 让我回到我强大的 View 模型而不是我的 AddItem 所在的 PersonCollectionInstance?

最佳答案

你需要写 data-bind="click: $parent.PersonCollectionInstance.AddItem" 因为你定义了你的 with 是这样的:

data-bind="with: PersonCollectionInstance.ItemToEditOrToAdd"`

所以您在 with 绑定(bind)中降低了两个级别,因为您访问了一个嵌套属性。但是 $parent 仍然指向您的主视图模型,因为 knockout 无法跟踪您的嵌套属性并且它不会为您创建嵌套上下文。

因此可以使用两个 with 来达到预期的结果:

<div id="new" data-bind="with: PersonCollectionInstance">
  <!-- ko with: ItemToEditOrToAdd -->
    <p>Firstname: <input type="text" data-bind="value: firstName"/></p>
    <p>Lastname: <input type="text" data-bind="value: lastName"/></p>
    <p>Age: <input type="text" data-bind="value: age"/></p>
    <p>Role: <input type="text" data-bind="value: role"/></p>
    <button data-bind="click: $parent.AddItem">Add new</button>
  <!-- /ko -->
</div>

如果你无论如何都使用两个 with 你可以把你的按钮“放在外面”:

<div id="new" data-bind="with: PersonCollectionInstance">
  <!-- ko with: ItemToEditOrToAdd -->
    <p>Firstname: <input type="text" data-bind="value: firstName"/></p>
    <p>Lastname: <input type="text" data-bind="value: lastName"/></p>
    <p>Age: <input type="text" data-bind="value: age"/></p>
    <p>Role: <input type="text" data-bind="value: role"/></p>       
  <!-- /ko -->
  <button data-bind="click: AddItem">Add new</button>
</div>

关于knockout.js - $parent 绑定(bind)不能像我想的那样工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337856/

相关文章:

jquery - 使用 knockout.js 从表单中获取或发送数据

javascript - 输入元素上的 knockout validation 错误类

javascript - 如何使用 Knockout 取消选择控件上的更改事件?

javascript - 订阅子属性的 knockout 可观察对象并在 TypeScript 的绑定(bind)上下文中调用父方法

knockout.js - 如何获取使用特定 knockout 绑定(bind)的所有元素的列表?

jquery - 检查 .getJSON 是否返回任何数据

javascript - 将属性与 Knockout.js 中多维可观察数组中的搜索字符串进行比较

knockout.js - John Papa 的 HotTowel this.handleError 未定义...为什么?

javascript - 这个javascript代码模式好吗?

javascript - 协助将 json 重新绑定(bind)到 knockout 模型