簡體   English   中英

使用序列化/反序列化ember.js進行初始化

[英]initialization with serialize/deserialize ember.js

我正在使用沒有ember數據的新Router ,因此必須為動態url段實現自己的serialize / deserialize serialize

我有一個ArrayController ,其中填充了Application#ready數據。

為簡單起見,假設我有2條路線: item > '/item/:item_id'items > '/items'

item路線中的反序列化方法看起來與此類似

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

如果我在items路線上初始化我的應用,然后通過{{action}}導航到特定商品的item路線,則一切正常。 另外,在這之后,我可以手動將URL更改為特定的id ,而不會出現問題。

但是,如果我嘗試在item路由(即/item/2 )中啟動我的應用,則deserialize將返回未定義的結果。 我假設這是因為Application#ready尚未完成填充控制器。

我該如何解決?

編輯:我認為回答了我的問題。 使用余燼數據。

異步

最后一點:您可能會問自己,如果在調用App.Post.find(1)時應用尚未加載Post 1>,則該系統如何工作。

之所以起作用,是因為ember-data總是立即返回一個對象,即使它需要啟動查詢也是如此。 該對象從一個空的data哈希開始。 服務器返回數據時,ember-data更新對象的data ,這還會觸發所有已定義屬性(使用DS.attr定義的屬性)上的綁定。

我不知道如何解決初始化問題,但是如果您不想這樣做,絕對不必使用ember-data

性格方面,我有:

  • 覆蓋了所有Ember.Routedeserialize方法,
  • 定義了一個具有類方法的App.ModelFetcher類:
    • find(id, doneRequestCallback, failRequestCallback)
    • all(doneRequestCallback, failRequestCallback)
  • 直接在deserialize調用App.ModelFetcher.find(id, function() {}, function() {})

ember-data一樣,這兩種方法分別返回一個空的App.Model對象和一個空數組。 完成請求后,這些對象將使用請求值進行膨脹。

可能有更好的解決方案,但是對我來說很好,並且看起來還不錯。

您還可以代替定義deserialize方法,只需定義經典的App.Model.find(id)函數(該函數返回一個空的App.Model實例),然后為對象設置狀態,如ember-data那樣(參見http://goo.gl/3otkt )。

如果動態片段的格式為model_id (請參見http://goo.gl/y86KE ),則該方法將由ember自動調用。

無論如何,我可能是錯的,但是我不喜歡您試圖在控制器中獲取對象的事實,但是除了上述方法之外,我沒有其他解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM