2013-11-24 57 views
0

在我的應用程序中,我的路線圖中有共同的父/子關係。find()和find(id)觸發到服務器的Ajax調用

App.Router.map(function() { 
    this.resource('strats', {path: "/"}, function() { 
     this.route('strat', {path: "/strat/:strat_id"}); 
    }); 
}); 

我的理解是,當灰燼首次進入父路由,它調用find()方法來獲取所有模型,通常會觸發一個Ajax調用服務器。然後,當Ember隨後轉換到子路由時,它首先調用find(),然後調用find(id)。如果我正在使用具有身份映射實現的數據層(如Ember-Data或Ember-Model),則對find()和find(id)的這些後續調用應導致從本地內存中獲取數據,而Ember只要應用程序正在運行,就不應該由於對這些函數的調用而啓動對服務器的另一個Ajax調用。如果這種理解是正確的,那麼我不應該在服務器端實現find(id)。

我在我的應用程序中使用Ember-Model。當我在兩條路線之間導航時,我在服務器端看到一個單獨的模型需要一段時間,這意味着調用find(id)有時會觸發對服務器的Ajax調用,這是意外的。上述邏輯中的缺陷在哪裏?

回答

0

首先,Ember本身只會做你的模型掛鉤告訴它做的事情。

而且只有在您重新訪問路線時纔會調用這些掛鉤。我將用上面的路由器舉一些例子。

App.Router.map(function() { 
    this.resource('cow'); 
    this.resource('strats', {path: "/"}, function() { 
     this.route('strat', {path: "/strat/:strat_id"}); 
    }); 
}); 
  1. 我參觀strats路線。該路線的模型鉤(StratsRou​​te)將會被擊中(在你的情況下,一個找到,返回多個戰術)。

  2. 我參觀了strat/1路線。路線模型鉤(StratsStratRoute)將會被擊中(找到(1))

  3. 我參觀了strat/2路線。 (2)

  4. 我參觀了牛的路線(這是戰術之外)。

  5. 我參觀了strat/1路線,每個路線的模型掛鉤都會被調用,每次只有1個路線到達路線。該StratsRou​​te將被調用,直到該模型已返回它會等待,一旦它返回它將會進入到StratsStratRoute路線,等到的問題得以解決,一旦解決,將繼續呈現網頁等

有趣的是Ember模型有一個有趣的功能,你可以使用findfetchfind將建立一個虛擬記錄並立即返回它,一旦ajax被返回,它就會更新模型。 fetch將返回一個承諾,一旦ajax已經返回並且記錄完全建立,它將解決承諾。

請注意,查找方法中存在一些競爭條件。想象一下,如果你在strats路徑中找到(),然後在strat路徑中找到(1)。他們都將立即解決(與虛擬記錄),並都打電話給服務器。第一次呼叫將用於所有記錄(可能包括1)第二次呼叫用於記錄1。所以我們只打了2個電話來紀錄,這真是太浪費了。在這種情況下,獲取會更好。讓我們用fetch思考它。在戰術路線中取路線,現在我們等到它解決了。一旦它解決了(又名服務器返回了所有的模型),我們點擊策略路線,它取得(1)而不是它擊中服務器,它知道它已經有模型1,它在戰術路線中下來,所以它不會發出ajax請求,並立即解決。

希望這可以清除一點灰塵。

+0

因此,最初由於您在最後一段中提到的時間問題,Ember最初會到達服務器以查找find()和find(n)。但在此之後,只要應用程序正在運行,Ember就不必再次進入服務器,因爲它已經將所有模型存儲在本地。我解釋正確嗎? – ptmoy2

+0

這是正確的。 – Kingpin2k