成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

angularjs利用ui-route異步加載組件

lunaticf / 644人閱讀

摘要:異步加載各個組件就很有必要。在這里我就以為框架來進行異步加載說明。而為了將服務(wù)進行異步加載我們不能用普通的或者。而需要調(diào)用或者如果采用進行編譯打包的話就需要的支持,這樣可以對進行拆分打包,達到異步加載的目的。

ui-route相比于angularjs的原生視圖路由更好地支持了路由嵌套,狀態(tài)轉(zhuǎn)移等等。隨著視圖不斷增加,打包的js體積也會越來越大,比如我在應(yīng)用里面用到了wangeditor里面多帶帶依賴的jquery就300多k。異步加載各個組件就很有必要。在這里我就以ui-route為框架來進行異步加載說明。

首先看一下路由加載文件

angular.module("webtrn-sns").config(["$stateProvider", function ($stateProvider) {
    $stateProvider.state({
            name: "home.message",
            url: "/message",
            abstract: true,
            templateProvider: ["resources", function (resources) {
                return resources.template
            }],
            controllerProvider: ["resources", (resources)=> {
                return resources.controller
            }],
            onEnter: ["resources", (resources)=>resources.css.use()],
            onExit: ["resources", (resources)=>resources.css.unuse()],
            resolve: {
                resources: ()=> {
                    return new Promise(
                        resolve => {
                            require([], () => {
                                resolve({
                                    css: require("./css/message_box.css"),
                                    template: require("./html/message_box.html"),
                                    controller: require("./js/message_box.js")
                                })
                            })
                        }
                    );
                }
            }
        }
    ).state({
            name: "home.message.add_message",
            url: "/add_message?isReply&toUid&title",
            params: {isReply: null, toUid: null, title: null},
            templateProvider: ["resources", function (resources) {
                return resources.template
            }],
            controllerProvider: ["resources", (resources)=> {
                return resources.controller
            }],
            onEnter: ["resources", (resources)=>resources.css.use()],
            onExit: ["resources", (resources)=>resources.css.unuse()],
            resolve: {
                resources: ()=> {
                    return new Promise(
                        resolve => {
                            require(["./js/message.js"], () => {
                                resolve({
                                    css: require("./css/add_message.css"),
                                    template: require("./html/add_message.html"),
                                    controller: require("./js/add_message.js")
                                })
                            })
                        }
                    );
                }
            }
        }
    )
}])

這個是路由狀態(tài)的一個聲明文件,name,url,param字段的方式不變,關(guān)鍵是看resolve這個部分。根據(jù)ui-route的resolve文檔,resolve是為了給state或者controller進行自定義注入對象的。

下面是舉出文檔中關(guān)于resolve的例子:

$stateProvider.state("myState", {
      resolve:{

         // Example using function with simple return value.
         // Since it"s not a promise, it resolves immediately.
         simpleObj:  function(){
            return {value: "simple!"};
         },

         // Example using function with returned promise.
         // This is the typical use case of resolve.
         // You need to inject any services that you are
         // using, e.g. $http in this example
         promiseObj:  function($http){
            // $http returns a promise for the url data
            return $http({method: "GET", url: "/someUrl"});
         },

         // Another promise example. If you need to do some 
         // processing of the result, use .then, and your 
         // promise is chained in for free. This is another
         // typical use case of resolve.
         promiseObj2:  function($http){
            return $http({method: "GET", url: "/someUrl"})
               .then (function (data) {
                   return doSomeStuffFirst(data);
               });
         },        

         // Example using a service by name as string.
         // This would look for a "translations" service
         // within the module and return it.
         // Note: The service could return a promise and
         // it would work just like the example above
         translations: "translations",

         // Example showing injection of service into
         // resolve function. Service then returns a
         // promise. Tip: Inject $stateParams to get
         // access to url parameters.
         translations2: function(translations, $stateParams){
             // Assume that getLang is a service method
             // that uses $http to fetch some translations.
             // Also assume our url was "/:lang/home".
             return translations.getLang($stateParams.lang);
         },

         // Example showing returning of custom made promise
         greeting: function($q, $timeout){
             var deferred = $q.defer();
             $timeout(function() {
                 deferred.resolve("Hello!");
             }, 1000);
             return deferred.promise;
         }
      },

      // The controller waits for every one of the above items to be
      // completely resolved before instantiation. For example, the
      // controller will not instantiate until promiseObj"s promise has 
      // been resolved. Then those objects are injected into the controller
      // and available for use.  
      controller: function($scope, simpleObj, promiseObj, promiseObj2, translations, translations2, greeting){
          $scope.simple = simpleObj.value;

          // You can be sure that promiseObj is ready to use!
          $scope.items = promiseObj.data.items;
          $scope.items = promiseObj2.items;

          $scope.title = translations.getLang("english").title;
          $scope.title = translations2.title;

          $scope.greeting = greeting;
      }
   })

我們可以看到resolve的對象是支持Promise的。

再回到我們之前的代碼templateProvidercontrollerProvider我們注入了resources的模板對象和controller對象,onEnteronExit注入了css模塊。

如果controller中依賴了服務(wù)怎么辦的?

resolve: {
    resources: ()=> {
        return new Promise(
            resolve => {
                require(["./js/message.js"], () => {
                    resolve({
                        css: require("./css/add_message.css"),
                        template: require("./html/add_message.html"),
                        controller: require("./js/add_message.js")
                    })
                })
            }
        );
    }
}

可以在require里面將服務(wù)注入,如代碼中的message.js。而為了將服務(wù)進行異步加載我們不能用普通的.factory或者.service。而需要調(diào)用$provide.factory或者$provide.service

如果采用webpack進行編譯打包的話就需要webpack.optimize.CommonsChunkPlugin的支持,這樣可以對js進行拆分打包,達到異步加載js的目的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80777.html

相關(guān)文章

  • ui-router學習

    摘要:關(guān)于應(yīng)用程序的行為類似于狀態(tài)機。將應(yīng)用程序的每個功能視為一組狀態(tài)。當嵌套狀態(tài)處于活動狀態(tài)時,該片段將附加到瀏覽器中父狀態(tài)的。父狀態(tài)可用于限制對整個子狀態(tài)樹的訪問,但本身不提供任何。如果方案返回,則轉(zhuǎn)換將暫停,直到解決狀態(tài)頂級狀態(tài)嵌套狀態(tài) 關(guān)于state UI-Router應(yīng)用程序的行為類似于狀態(tài)機。 將應(yīng)用程序的每個功能視為一組狀態(tài)。一次只能有一個狀態(tài)為活動狀態(tài)。用戶可以從一種狀態(tài)轉(zhuǎn)換...

    sixleaves 評論0 收藏0
  • 我用ionic框架寫了個豆瓣圖書館

    摘要:集移動應(yīng)用與框架與一身的框架利用我們可以輕易制造出一款帶有原生應(yīng)用與體驗的移動這次我們就搭建一個圖書還能聽歌看電影實現(xiàn)了一些基本的功能,搜索圖書類型,查看圖書詳情,搜索圖書標簽,查看圖書筆記等。前端交互采用了與綁定的。 ionic : 集移動應(yīng)用UI與 angularjs 框架與一身的 Hybrid App 框架 利用 ionic 我們可以輕易制造出一款帶有原生應(yīng)用UI與體驗的移動A...

    eechen 評論0 收藏0
  • angularjs+springMvc學習筆記

    摘要:回調(diào)說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網(wǎng)上的一些博客和例子,大都以定時任務(wù)為例子說明,但具體的原理我還是不太 回調(diào) 說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)success和error,下...

    dreamGong 評論0 收藏0
  • angularjs+springMvc學習筆記

    摘要:回調(diào)說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網(wǎng)上的一些博客和例子,大都以定時任務(wù)為例子說明,但具體的原理我還是不太 回調(diào) 說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)success和error,下...

    rozbo 評論0 收藏0
  • 【知識點】為什么推薦用ui-router替代ngRoute

    摘要:被認為是為開發(fā)者提供的最實用的一個模塊。與集成的服務(wù)不同的是,可以將視圖嵌套,因為它基于的是操作狀態(tài)而僅非。與傳統(tǒng)做法使用不同的是,在里需要使用服務(wù)。當在中處理路由和狀態(tài)時,開發(fā)者的重心是當前的狀態(tài)是什么以及在哪一個頁面里。 初學angularjs,第一個實例是官網(wǎng)的phoneCat,里面路由用的是ngRoute,后來看到別的用ui-router,覺得好奇,ui-route是什么呢?百...

    Shonim 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<