国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

lunaticf / 638人閱讀

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

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

首先看一下路由加載文件

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")
                                })
                            })
                        }
                    );
                }
            }
        }
    )
}])

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

下面是舉出文檔中關(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ù)進(jìn)行異步加載我們不能用普通的.factory或者.service。而需要調(diào)用$provide.factory或者$provide.service

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

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

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

相關(guān)文章

  • ui-router學(xué)習(xí)

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

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

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

    eechen 評論0 收藏0
  • angularjs+springMvc學(xué)習(xí)筆記

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

    dreamGong 評論0 收藏0
  • angularjs+springMvc學(xué)習(xí)筆記

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

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

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

    Shonim 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<