3

ExtJS モデル フィールドにはマッピング オプションがあります。

fields: [
        {name: 'brandId', mapping:'brand.id',   type: 'int'},
        {name: 'brandName', mapping:'brand.name', type: 'string'},

問題は、サーバーからの応答に一部のフィールド (私の例ではブランド フィールド) が含まれておらず、内部フィールドからのマッピングが定義されている場合、Ext Store は何も表示されずにレコードのロードに失敗することです。

誰もこれに問題がありますか?バグの一種でしょうか?

更新 明確にするために、モデルに10個のフィールドがあるとします。サーバーからの応答には 9 つのフィールドがあり、1 つがありません。このフィールドにネストされたマッピング (マッピング:'xyz') がない場合、すべて問題ありません。ストアはレコードをロードし、フィールドは空です。ただし、このフィールドをネストされたフィールドからロードする必要があり、マッピング オプションがある場合、store は何もロードできません。

更新 2 問題を引き起こすコードを見つけました。事実: Ext が Json からいくつかのフィールドをロードしようとすると、次のようなチェックが実行されます。

(source["id"] === undefined) ? __field0.defaultValue : source["id"]

しかし、フィールドにマッピング オプション (mapping 'brand.id') がある場合、リーダーはこのようにします。

(source.brand.id === undefined) ? __field20.defaultValue : source.brand.id

ソースにブランド フィールドがない場合、エラーが発生します。

私と同じ問題がある場合: Ext.data.reader.Jsonのメソッド createFieldAccessExpressionをオーバーロードすることで修正できます

4

2 に答える 2

2

Ext は、レコード全体ではなく、そのフィールドのロードのみに失敗するべきであることに同意します。素晴らしいものではありませんが、機能するはずのオプションの 1 つは、代わりにmapping関数を使用することです。

{
    name: 'brandId',
    mapping: function(data, record) {
        return data.brand && data.brand.id;
    }
}

引数が間違っている可能性があります (ソース コードを見て、この機能が存在することがわかりました)。そのため、このように機能しない場合に利用できるものを確認するために、そこにブレークポイントを配置します。

于 2012-04-29T03:29:28.283 に答える
0

あなたは誤解mappingnestingパラダイムだと思います。これらは互換性がありません。データにネストを定義する場合、結果には対応するフィールドが含まれている必要があります。

于 2012-04-30T08:34:43.023 に答える