2014-12-21 33 views
0

我試圖在Ember.js應用程序中實現延遲加載。理想情況下,我寧願將每個模塊的所有相關代碼(包括任何控制器和路由定義)都包含在單獨的.js文件中,該文件將被加載延遲。在Ember.js中延遲加載路由定義

現在,當我轉換到路由時,js文件被正確加載,但由於Ember隱式生成路由定義,所以使用隱式生成的路由對象而不是我的延遲加載的js文件中的路由。

在我懶惰的js文件中,我有一條路線App.UsersManagerRoute,應該鏈接到users.manager路線。在Ember Inspector中,我可以看到正在使用隱式生成的路由,即使在我加載了js文件之後。

爲了解決這個問題,我試圖在加載js文件後手動註冊路由,但似乎沒有工作。這是我的代碼,不會延遲加載:

Ember.Router.reopen({ 
    _doTransition: function (_targetRouteName, models, _queryParams) { 
    var resourceName = _targetRouteName.split('.')[0]; 
    var self = this; 
    var transition = self._super(_targetRouteName, models, _queryParams); 
    transition.abort(); 
    var fullRouteName = 'route:' + camelizeRouteName(_targetRouteName); 
    self.container.unregister(fullRouteName); 
    App.lazyLoad(resourceName, function() { 
     self.container.register(fullRouteName, App[sentenceCasedRouteName(_targetRouteName) + 'Route']); 
     transition.retry(); 
    }); 
    return transition; 
    } 
}); 

我註銷隱式生成的路線和註冊我的懶加載路由之後,路由定義似乎是正確地使用,但由於某些原因,我看到一個空白頁面而不是正確的模板。我不太清楚我在這裏錯過了什麼,或者我想要做的是推薦的方法。

所有在Ember中的延遲加載的例子我迄今爲止所見到的將路徑放在延遲加載的文件之外。那是唯一的選擇嗎?

+0

另外的路線,延遲加載也將介紹queryParams問題在控制器上。 – jcbvm

回答

0

自動生成的燼對象是由鏈接到組件通過href計算屬性。爲了避免這種行爲(它可能負責空白頁)我建議改變href以避免調用函數來計算所謂的「意圖」,以自動生成缺失的對象。

1

自動生成餘燼路由是由link-to組件通過href計算屬性引起的。切勿反對它。灰燼不能正常工作,你會鬆動。但是爲了理解這個機制,你應該深入瞭解它。

href LinkToComponent方法請求URL。在回答之前,Ember尋找路線。如果它不存在,Ember會從route:basic創建一個。

ContainerRegistry有一些有用的方法:resetlookup前,registerunregister後者。

registerunregister修改註冊表。

lookup如果它們不存在,則創建實例,在factoryCache中查找工廠,並將它們存儲在cache中。如果工廠不存在,它會詢問Registry

reset清除指定成員的cachefactoryCache

這就是說,爲了實現延遲加載應該是正確的順序:

unregister(fullName); 
reset(fullName); 
register(fullName, factory); 
lookup(fullName); 

對於初步的解決方案,看看https://github.com/ricottatosta/ember-wiz