国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺析AngularJS中的生命周期和延遲處理

2019-11-20 12:13:13
字體:
來源:轉載
供稿:網友

這里,我們再討論一些常用的高級的控制反轉容器(Inversion of Control containers):延遲加載(lazy-loading),生命周期管理(lifetime management),以及延遲的創建/處理(deferred creation/resolution)。
 
延遲加載(Lazy-Loading)

所謂延遲加載就是當你需要用到對象時候才對其進行實例化。許多依賴注入系統都會在一開始就創建組件,作為它的可依賴項目。不過有時候,直到在應用中用到它們之前,你都不會想去實例化這些組件。Angular 中,一個很好的例子就是,當你在配置的時候去設置一個行為,而該行為又會引用到一些還沒創建的組件。

假設你想攔截系統內建的 $log 服務,因此你把它存在了 $rootScope 里面。當然我不建議這樣做,不過這樣舉例比較簡單有效。為了攔截,你在配置的時候用到了 $provide 然后調用修飾方法。如果這時你想直接引用 $rootScope 的話,由于循環引用你會拿到個異常。而解決案是通過 $injector 延遲加載 $rootScope 。


下面的代碼只會在 $rootScope 第一次被使用的時候才去加載它。

 

$provide.decorator(, [, ,   ($delegate, $injector) {     log = $delegate.log.bind($delegate);    $delegate.log = (msg) {       rs = $injector.get();       (rs.logs === undefined) {        rs.logs = [];      }      rs.logs.push(msg);      log(msg);    };     $delegate;}]);

之后的調用都會拿到一樣的單例 $rootScope。 這里有個可用例子。我之前好像聽過有個(不對的)說法(Angular 只支持單例) … 當然不是真的。$injector 中的方法就是用來給你管理你的組件的生命周期的。

生命周期管理

生命周期涉及到你如何管理組件的實例。默認情況,當你注入一個 Angular 的依賴,依賴注入就會幫你創建它的一個副本然后在你的應用里面重用它。大多數情況下這確實是我們所期待的。而有些情況下,會要求同一組件的多個實例。假設下面的計數服務:

 
 

Counter($log) {  $log.log();} angular.extend(Counter.prototype, {  count: 0,  increment: () {    .count += 1;     .count;  }}); Counter.$inject = []; app.service(, Counter);

你的應用要跟蹤不同的計數器。而你注入該服務后,總會拿到一樣的計數器。這難道是 Angular 的限制?

當然不是。重復一次,通過 $injector 服務你可以在任何時候創建一個新副本。下面的代碼用了兩個獨立的計數器:
 

app.run([, , ,   (rs, c, i) {    rs.count = c.count;    rs.update = c.increment;    rs.update2 = () {       c = i.instantiate(Counter);      rs.count2 = c.count;      rs.update2 = () {        c.increment();        rs.count2 = c.count;      };    };  }]);

你可以看到計數器都是被獨立的實例跟蹤的,這里是可用例子。如果你需要經常生成新實例,你可以像這樣注冊服務:
 

app.factory(, [,   (i) {     {      getCounter: () {         i.instantiate(Counter);      }    };  }]);

產生一個需要的實例就是那么簡單,而且你可以用你的工廠組件來代替 $injector:
 

app.run([, ,   (rs, cf) {     c1 = cf.getCounter(),      c2 = cf.getCounter();    rs.count = c1.count;    rs.update = c1.increment;    rs.count2 = c2.count;    rs.update2 = () {      rs.count2 = c2.increment();    };  }]);

你可以看看這個完整版本的可用例子。如你所見,用 Angular 的內建依賴注入是完全有可能管理你組件的生命周期的。那延遲處理(deferred resolution)又怎樣呢

主站蜘蛛池模板: 新竹县| 芦溪县| 凤冈县| 华池县| 岱山县| 达日县| 贵阳市| 山阳县| 宁化县| 龙门县| 洪雅县| 汶上县| 长沙市| 枞阳县| 绍兴市| 武威市| 化州市| 阿拉善右旗| 招远市| 白银市| 临城县| 宝应县| 乐东| 广州市| 海安县| 南岸区| 得荣县| 乌恰县| 罗甸县| 台北市| 吴堡县| 商洛市| 孝昌县| 石狮市| 永德县| 大丰市| 望江县| 榆树市| 乌拉特后旗| 涡阳县| 胶州市|