0

ノックアウト監視可能配列に追加するコードがいくつかあります。監視可能配列をオブジェクトに変換し、新しいオブジェクトのシフトを解除してから、このオブジェクトをビューモデルにマッピングします。これは機能しますが、非常に遅いようです。2~5秒以上かかります。

function addContact(office) { // Passing in object array of agency. We no it contains correct office and agency ID

        // Assign observable data to new variable then remove old
        // variable from mapping
        var objAgency = ko.toJS(agency);

        vm.agency.removeAll();


        // Fill new object with empty strings and related data
        var objContact = {
            agencyID: office.agencyID._latestValue,
            emailAddress: "",
            firstName: "",
            jobName: "",
            office: "",
            OfficeID: office.officeID._latestValue,
            personID: "",
            surName: "",
            title: ""
        }



        // unshift where office ID match
        for (i in objAgency[0].offices) {
                if (!isNaN(i)) {
                    if (objAgency[0].offices[i].officeID === objContact.OfficeID) {
                        objAgency[0].offices[i].contacts.unshift(objContact); // At i remove one object
                    }
                else {

                }
            } 
        }
        vm.agency([ko.mapping.fromJS(objAgency[0])]);
    }

変換プロセスを実行する代わりに、オブザーバブルに追加しようとしましたが、次のエラーが発生しました。

Unhandled exception at line 9423, column 13 in http://localhost:13762/scripts/breeze.debug.js

0x800a01b6 - JavaScript runtime error: Object doesn't support property or method 'getProperty'

これはエラーの原因となるコードです

for (i in agency._latestValue[0].offices._latestValue) {
            if (!isNaN(i)) {
                if (agency._latestValue[0].offices._latestValue[i].officeID = objContact.OfficeID) {
                    agency._latestValue[0].offices._latestValue[i].contacts._latestValue.unshift([ko.mapping.fromJS(objContact)]);
                }
            }
        }

代理店がどのように見えるかについては、私のスクリーンショットを参照してください。

私のグローバル観測可能配列

この監視可能な配列に追加する正しい方法は何ですか? 最新の値は変更を追跡するためのメカニズムであることを理解しているので、それを改ざんすべきではありませんか?

4

1 に答える 1

1

._latestValue確か、knockout-{version}.debug.js ファイルを参照している場合のプロパティです。knockout-{version}.js を使用する場合、それはありません。いずれにしても、myObservable._latestValue === myObservable() === ko.unwrap(myObservable). _latestValue本番環境で縮小されたノックアウト js ファイルを使用すると、このコードが壊れてしまうため、参照したくありません。コードを次のように書き直す必要があります。

for (i in agency().offices()) {
    if (!isNaN(i)) {
        if (agency().offices()[i].officeID = objContact.OfficeID) {
            agency().offices()[i].contacts().unshift([ko.mapping.fromJS(objContact)]);
        }
    }
}

あなたのif比較は比較ではなく、割り当てであるため、それはまだ正しくありません。使用===:if (agency().offices()[i].officeID === objContact.OfficeID)

agency().offices()[i].officIDこれでうまくいくかもしれませんが、もオブザーバブルであると思われるため、疑いがあります。その場合、 を使用し()てその基になる値にアクセスする必要があります。

別の問題は、次のように、配列を配列にシフト解除していることです。

var arr = ["A", "B"];
arr.unshift(["Z"]);
// Result: [["Z"], "A", "B"];

したがって、配列に配列を追加するつもりがない限り、.unshift 関数内の括弧を失います。仲良くするのが好きな人もいます。

また、基になる配列を呼び出しoffices().unshift(value);て操作することもできますが、このように observableArray で unshift を直接呼び出すことをお勧めします。これoffices.unshift(value);は、KO がサブスクライバーに通知し、DOM を更新するためです。それ以外の場合は、値が変更されたことを KO に通知する必要があります。このフィドルの違いを見てください。

問題の解決に役立つことを願っています。

于 2013-09-11T15:09:03.793 に答える