2

私はember-dataなしで新しいものを使用しているので、動的URLセグメント用Routerに独自のserialize/を実装する必要があります。deserialize

ArrayController内にデータが入力されているがありますApplication#ready

簡単にするために、2つのルートがあるとしましょう:item > '/item/:item_id'items > '/items'

ルートのdeserializeメソッドは、itemこれに沿ったものに見えます

 deserialze: function(router, params){ 
     return router.get('myController')
                  .findProperty('id', params['item_id']);
 }

ルート上でアプリを初期化し、すべてを介して特定のアイテムitemsのルートに移動すると、すべて正常に機能します。また、この時点以降、問題なくURLを特定のURLに手動で変更できます。item{{action}}id

ただし、itemルート(つまり/item/2)でアプリを起動しようとすると、 deserializeundefinedが返されます。Application#readyこれは、コントローラーへの入力が完了していないためだと思います。

これを回避するにはどうすればよいですか?

編集:これは私の質問に答えると思います。ember-dataを使用します。

非同期

最後のポイント:アプリが呼び出されるまでにPost 1>がまだロードされていない場合、このシステムがどのように機能するかを自問するかもしれませんApp.Post.find(1)

これが機能する理由はember-data、クエリを開始する必要がある場合でも、常にオブジェクトをすぐに返すためです。dataそのオブジェクトは空のハッシュで始まります。サーバーがデータを返すと、ember-dataはオブジェクトのdataを更新します。これにより、定義されたすべての属性(を使用して定義されたプロパティDS.attr)のバインディングもトリガーされます。

4

1 に答える 1

4

初期化の問題を修正する方法はわかりませんが、必要がないember-data場合は絶対に使用する必要はありません。

個人的に、私は持っています:

  • deserializeすべてのメソッドをオーバーライドしEmber.Route
  • App.ModelFetcherクラスメソッドを持つクラスを 定義しました:
    • find(id, doneRequestCallback, failRequestCallback)
    • all(doneRequestCallback, failRequestCallback)
  • App.ModelFetcher.find(id, function() {}, function() {})に直接電話するdeserialize

これらの2つのメソッドは、同様に、それぞれ空のオブジェクトと空の配列をember-data返します。App.Modelリクエストが完了すると、これらのオブジェクトはリクエスト値で膨らみます。

より良い解決策があるかもしれませんが、それは私にとってはうまく機能し、それほど悪くはありません。

また、メソッドをオーバーライドする代わりにdeserialize、クラシックApp.Model.find(id)関数(空のApp.Modelインスタンスを返す)を定義してから、オブジェクトに状態を設定することもできますember-datahttp://goo.gl/3otktを参照)。

動的セグメントの形式が形式の場合、メソッドはemberによって自動的に呼び出されますmodel_idhttp://goo.gl/y86KEを参照)。

とにかく、私は間違っている可能性がありますが、あなたがコントローラーにオブジェクトを取得しようとしているという事実は好きではありませんが、上記以外の解決策はありません。

于 2012-08-22T10:40:42.890 に答える