【问题标题】:Uncaught Error: Unable to process binding "foreach" (knockout js)未捕获的错误:无法处理绑定“foreach”(淘汰 js)
【发布时间】:2020-05-03 07:41:08
【问题描述】:

错误:

“未捕获的错误:无法处理绑定“foreach:函数(){返回电话}” 消息:看起来像可观察对象的无效对象;可能来自另一个 Knockout 实例”

html:

<h3>Contacts</h3>
<div >
    <table >
        <thead>
            <tr>
                <th>first name</th>
                <th>last name</th>
                <th>number</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: contacts">
            <tr>
                <td>
                    <input data-bind="value :firstName" /><br />
                    <a href="#" data-bind="value : $root.deleteContact">delete contact</a>
                </td>
                <td>
                    <input data-bind="value : lastName" />
                </td>
                <td>
                    <table>
                        <tbody data-bind="foreach : phones">
                            <tr>
                                <td><select data-bind="options : contactType , value : contactTypeValue"></select></td>
                                <td><input data-bind="value : number" /></td>
                                <td><a href="#" data-bind="click : $root.deleteNumber">delete number</a></td>
                            </tr>
                        </tbody>
                    </table>
                    <a href="#" data-bind="click :$root.addNumber">add number</a>
                </td>
            </tr>
        </tbody>
    </table>
    <br /><br />
    <button data-bind="click : addContact"> add contact</button>
</div>

javascript:

var contactsModel = function ()
    {
     var self = this;
     this.contacts = ko.observableArray([]);
     this.addContact = function ()
     {
         this.contacts.push({
             firstName: "",
             lastName: "",
             phones: ko.observableArray()
         });
     };
     this.deleteContact = function (contact)
     {
         this.contacts.remove(contact);
     };
     this.addNumber = function (contact)
     {
         contact.phones.push({
             type: "",
             number: ""
         });
     };
     this.deleteNumber= function (phone)
     {
         $.each(this.contacts(), function () { this.phones.remove(phone) })
     };
    }
ko.applyBindings(new contactsModel());

我是 Knockout JS 的新手,所以有人可以解决上述错误。

【问题讨论】:

  • 将此行 &lt;a href="#" data-bind="value : $root.deleteContact"&gt;delete contact&lt;/a&gt; 更改为 &lt;a href="#" data-bind="click: $root.deleteContact"&gt;delete contact&lt;/a&gt;
  • @Nerdroid 我已将值绑定更改为单击元素上的绑定,但它没有解决错误。
  • 我忘了说当我点击第一行self.contacts.push上的addContact时会产生这个错误。如果我第二次单击它会给出错误您不能多次将绑定应用于同一个元素如果我第三次单击它会给出错误无法读取未定义的属性“长度” .

标签: javascript jquery data-binding foreach knockout.js


【解决方案1】:

我会注意两件事。 首先,您声明 observableArray 中没有空数组,这可能看起来像一个简单的案例,但淘汰赛在数组声明方面存在问题,至少在某些版本中是这样。 所以改成这样:

this.contacts.push({
             firstName: "",
             lastName: "",
             phones: ko.observableArray([]) // here
         });

您定义self=this; 也是有原因的,但您从未真正使用它。 像这样重写你的代码:

var contactsModel = function ()
    {
     var self = this;
     self.contacts = ko.observableArray([]);
     self.addContact = function ()
     {
         self.contacts.push({
             firstName: "",
             lastName: "",
             phones: ko.observableArray([])
         });
     };
     self.deleteContact = function (contact)
     {
         this.contacts.remove(contact);
     };
     self.addNumber = function (contact)
     {
         contact.phones.push({
             type: "",
             number: ""
         });
     };
     self.deleteNumber= function (phone)
     {
         $.each(self.contacts(), function () { self.phones.remove(phone) })
     };
    }

【讨论】:

  • 我已将代码更改为上述代码,但没有解决错误。我忘了提到当我点击第一行self.contacts.push上的addContact时会产生这个错误。如果我第二次单击它会给出错误您不能多次将绑定应用于同一个元素如果我第三次单击它会给出错误无法读取未定义的属性“长度” .
猜你喜欢
  • 2014-05-29
  • 2021-04-29
  • 2015-03-17
  • 2017-02-22
  • 2014-12-01
  • 2014-11-29
  • 2016-01-22
  • 2015-03-23
相关资源
最近更新 更多