2

次のフィドルを参照してください: http://www.senchafiddle.com/#xXQlp コンソールを開いて、誤ったデータを示す出力を確認してください。

ここでは、2 つの Student モデルを作成していることがわかります。それぞれのモデルには 0+ Award モデルのリストがあります。Dave は 2 つのかなり良い賞を受賞しました - 当然のことですが :) - 一方、Chaz は 2 つのあまり良くない賞を追加しました。問題は、ロギングが実際にChazが4つの賞を獲得することを示していることです(2つの良い賞と2つの悪い賞)。

このフィドルは、はるかに大きなアプリの深刻な煮詰めですが、私が抱えていた大きな問題の原因としてこれを分離しました - 私はそれに対する「修正」さえ見つけました. フィドルから 55 行目と 56 行目のコメントを外して再度実行すると (必ずローカル ストレージをクリアしてください!)、Chaz が必要な賞を 2 つしか持っていないことがわかります。

理由が明らかであることを願っていますが、これは私が満足している修正ではありません。チャズが4つの賞すべてを獲得する原因となるには、私が協会に対して何か間違ったことをしているに違いありません. ... もちろん?

乾杯!

更新:以下の回答が受け入れられ、autoLoad:true を削除すると問題が解決します。ただし、autoLoad が必要なため、Student モデルの init に次を実装しました。

for (var i=0, l=this.associations.all.length; i<l; i++) {
    var assoc = this.associations.all[i];
    if (assoc._type == "hasmany") {
        var assocName = assoc._name;
        var getterName = 'get' + assocName.charAt(0).toUpperCase() + assocName.slice(1);
        this[getterName] = function(assocName) {
            var self = this;
            return function() {
                var store = self[assocName]();
                if (!store.isLoaded()) {
                    store.load();
                }
                return store;
            }
        }.call(this, assocName)
    }
}

これにより、学生が持っている hasMany アソシエーションごとに getter が追加され、そのアソシエーションのストアが返される前に確実にロードされます。つまり、student1.awards() ではなく、student1.getAwards() を使用して、student1 の賞にアクセスできるようになり、賞が読み込まれることがわかります。これは、モデルに追加する他の hasMany アソシエーションに対して自動的に機能します。

これが一部の読者に役立つことを願っています。

4

1 に答える 1

2

autoload: trueアワードを自動ロードしないとこれが解決され、学生の >> アワードの hasMany 関連付けが削除されます。アワードのオートロードが問題を起こす理由は完全には理解できませんが、このフォーラムのスレッドはバグであることを示唆しています: http://www.sencha.com/forum/showthread.php?195371-autoloaded-associations-don-t-properly -JSON プロキシからのフィルター データ

作業例: http://www.senchafiddle.com/#xXQlp#S3Af0

于 2012-05-31T17:25:55.063 に答える