4

Web ページの読み込み時にいくつかの初期値が設定されているノックアウトの監視可能な配列があり、ユーザーがページを操作するときに splice メソッドを介して監視可能な配列に追加したいと考えています。配列に追加しようとしている新しいアイテムは、配列内の元のアイテムとまったく同じプロパティを持っていますが、新しいアイテムを既存の配列にスプライスしようとすると、ノックアウト バインディング エラーが発生します。例: "エラー: バインディングを解析できません。メッセージ: ReferenceError: ContactName が定義されていません。バインディング値: テキスト: ContactName ". このエラーは、問題のプロパティが新しい配列のすべての項目に存在する場合でも発生します。バインディングを自動的に更新したいので、基礎となる配列オブジェクトではなく、Knockout 観測可能配列でスプライスを実行しようとしています。vmContacts.Contacts.splice(vmContacts.Contacts().length,0,contactData2);.

ここでフィドルの例を作成したので、実際の動作を確認できます: http://jsfiddle.net/ak47/pMFwe/。[連絡先の追加] ボタンをクリックすると、ブラウザー コンソールにエラーが表示されます。

新しいオブジェクトの配列をループして、追加する必要がある各アイテムに対して push() を実行するのを避けたいのですが、スプライスが機能するはずですが、そうではありません。これは Knockout の既知の問題ですか、それとも何か間違っていますか? 助けてくれてありがとう!

4

2 に答える 2

7

contactData2の 3 番目のパラメーターとしてを渡そうとしましたが、3 番目のパラメーターとして配列をサポートしてArray.spliceArray.spliceません。ドキュメントも参照してください。

したがって、次のようなものを書く必要があります

vmContacts.Contacts.splice(vmContacts.Contacts().length, 0, 
   contactData2[0], contactData2[1], contactData2[2], contactData2[3]);

または、2 つの配列を「結合」するためにpush一緒に使用できます。apply

vmContacts.Contacts.push.apply(vmContacts.Contacts,contactData2);

JSFiddle のデモ。

于 2013-03-14T16:50:34.247 に答える
-1

オブザーバブルを含むビューモデルを作成するのではなく、JSONをまっすぐなJSオブジェクトに解析するだけです。これを行うには、マッピングプラグインを使用します。

var contactData2 = ko.mapping.fromJSON(contactJSON1);

同様に、foreachループを使用してそれぞれを配列に追加することから抜け出すことはできないと思います。

var contactData2 = ko.mapping.fromJSON(contactJSON2);
ko.utils.arrayForEach(contactData2(), function(item) {
vmContacts.Contacts.push(item);
于 2013-03-14T16:45:15.303 に答える