2012-04-27 8 views
3

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

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

問題がある:サーバーからの応答は、いくつかのフィールド(私の例では、ブランドのフィールド)が含まれていないと内側のフィールドからのマッピングが定義されている場合、内線Storeは静かにすべてのレコードをロードするために失敗しました。

誰にも問題がありますか?それは何らかのバグですか?

更新 私のモデルには10個のフィールドがあるとします。サーバーからの応答に9つのフィールドがあり、1つが欠落しています。このフィールドにネストされたマッピングがない場合(マッピング: 'x.y.z')、すべてがOKです。ストアのロードレコードがあり、フィールドは空です。しかし、このフィールドをいくつかのネストされたフィールドからロードしなければならず、マッピングオプションがある場合、ストアは何もロードしません。

UPDATE 2 問題を引き起こすコードが見つかりました。事実は次のとおりです。extはJSONからいくつかのフィールドをロードしようとしたとき、それはこの

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

しかし、のようなチェックを実行し、フィールドには、マッピングオプション(マッピング「brand.id」)Readerがそれをこのようにしていたときに

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

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

あなたは私と同じ問題を抱えている:あなたはExt.data.reader.Jsonの方法createFieldAccessExpression私は内線だけそのフィールドをロードするために失敗することに同意し

+0

ストアがレスポンスにレコードが見つからない場合は、他にどのような動作が期待できますか?つまり、あなたの問題は何ですか? –

+0

さて、レコードはサーバーから来ています。「ブランド」フィールドはありません。レコードが一部のフィールドを紛失してマッピングがない場合、すべてがOKで、ストアがレコードをロードし、フィールドが空です – mik

+0

"(私の例ではブランドフィールド)"ここにはブランドフィールドはありません。あなたはbrandIdとbrandNameを持っています。どうか明らかにしてください。 – Jere

答えて

2

オーバーロードすることによってそれを修正することができ、レコード全体ではありません。多分(私はこの機能は、ソースコードを見て、存在していたことを考え出した)私は引数が間違っている可能性があり

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

、それほど:素晴らしいではありませんが、動作するはずです、代わりにmapping機能を使用している一つのオプションこのように動作しない場合は、そこにブレークポイントを設定して使用可能なものを確認してください。

+0

FYIこれは設計上の決定でした。データの読み込みはかなり遅くなる可能性があります。したがって、複雑なjson式が使用される場合にtry catchブロックを使用する必要はありません。 –

+0

Extは私がこの返答でやったことがあるかもしれません。これは "&&" - 区切られたドットパスなので、存在しなければ 'false'を得ます。 –

+0

良い考え、BigSean。しかし、私は "try ... catch ..."ブロックに行きました。 – mik

0

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

+0

ええ、それはこのように動作することが判明しましたが、ドキュメンテーションには何も言われておらず、これは誤った動作だと思います。 – mik