麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

angularjs項目的頁面跳轉如何實現(5種方法)

2019-11-19 16:29:17
字體:
來源:轉載
供稿:網友

Angular頁面傳參有多種辦法,根據不同用例,我舉5種最常見的:

PS: 在實際項目中,請參照https://github.com/johnpapa/angular-styleguide優化您的代碼。

1. 基于ui-router的頁面跳轉傳參

(1) 在AngularJS的app.js中用ui-router定義路由,比如現在有兩個頁面,一個頁面(producers.html)放置了多個producers,點擊其中一個目標,頁面跳轉到對應的producer頁,同時將producerId這個參數傳過去。

.state('producers', {  url: '/producers',  templateUrl: 'views/producers.html',  controller: 'ProducersCtrl'}).state('producer', {  url: '/producer/:producerId',  templateUrl: 'views/producer.html',  controller: 'ProducerCtrl'})

(2) 在producers.html中,定義點擊事件,比如ng-click="toProducer(producerId)",在ProducersCtrl中,定義頁面跳轉函數 (使用ui-router的$state.go接口):

.controller('ProducersCtrl', function ($scope, $state) {  $scope.toProducer = function (producerId) {    $state.go('producer', {producerId: producerId});  };});

(3) 在ProducerCtrl中,通過ui-router的$stateParams獲取參數producerId,譬如:

.controller('ProducerCtrl', function ($scope, $state, $stateParams) {  var producerId = $stateParams.producerId;});

2. 基于factory的頁面跳轉傳參

舉例:你有N個頁面,每個頁面都需要用戶填選信息,最終引導用戶至尾頁提交,同時后一個頁面要顯示前面所有頁面填寫的信息。這個時候用factory傳參是比較合理的選擇(下面的代碼是一個簡化版,根據需求可以不同定制):

.factory('myFactory', function () {    //定義參數對象  var myObject = {};    /**   * 定義傳遞數據的setter函數   * @param {type} xxx   * @returns {*}   * @private   */  var _setter = function (data) {    myObject = data;     };  /**   * 定義獲取數據的getter函數   * @param {type} xxx   * @returns {*}   * @private   */  var _getter = function () {    return myObject;  };  // Public APIs  // 在controller中通過調setter()和getter()方法可實現提交或獲取參數的功能  return {    setter: _setter,    getter: _getter  };});

3. 基于factory和$rootScope.$broadcast()的傳參

(1) 舉例:在一個單頁中定義了nested views,你希望讓所有子作用域都監聽到某個參數的變化,并且作出相應動作。比如一個地圖應用,某個$state中定義元素input,輸入地址后,地圖要定位,同時另一個狀態下的列表要顯示出該位置周邊商鋪的信息,此時多個$scope都在監聽地址變化。

PS: $rootScope.$broadcast()可以非常方便的設置全局事件,并讓所有子作用域都監聽到。

.factory('addressFactory', ['$rootScope', function ($rootScope) {  // 定義所要返回的地址對象    var address = {};    // 定義components數組,數組包括街道,城市,國家等  address.components = [];  // 定義更新地址函數,通過$rootScope.$broadcast()設置全局事件'AddressUpdated'  // 所有子作用域都能監聽到該事件  address.updateAddress = function (value) { this.components = angular.copy(value); $rootScope.$broadcast('AddressUpdated');  };    // 返回地址對象  return address;}]);

(2) 在獲取地址的controller中:

// 動態獲取地址,接口方法省略var component = {  addressLongName: xxxx,  addressShortName: xx,  cityLongName: xxxx,  cityShortName: xx,  countryLongName: xxxx,  countryShortName: xx,  postCode: xxxxx     };// 定義地址數組$scope.components = [];$scope.$watch('components', function () {  // 將component對象推入$scope.components數組  components.push(component);  // 更新addressFactory中的components  addressFactory.updateAddress(components);});

(3) 在監聽地址變化的controller中:

// 通過addressFactory中定義的全局事件'AddressUpdated'監聽地址變化$scope.$on('AddressUpdated', function () {  // 監聽地址變化并獲取相應數據  var street = address.components[0].addressLongName;  var city = address.components[0].cityLongName;  // 通過獲取的地址數據可以做相關操作,譬如獲取該地址周邊的商鋪,下面代碼為本人虛構  shopFactory.getShops(street, city).then(function (data) {    if(data.status === 200){     $scope.shops = data.shops;     }else{     $log.error('對不起,獲取該位置周邊商鋪數據出錯: ', data);    }  });});

4. 基于localStorage或sessionStorage的頁面跳轉傳參

注意事項:通過LS或SS傳參,一定要監聽變量,否則參數改變時,獲取變量的一端不會更新。AngularJS有一些現成的WebStorage dependency可以使用,譬如gsklee/ngStorage ? GitHub,grevory/https://github.com/grevory/angular-local-storage。下面使用ngStorage來簡述傳參過程:

(1) 上傳參數到localStorage - Controller A

// 定義并初始化localStorage中的counter屬性$scope.$storage = $localStorage.$default({  counter: 0});// 假設某個factory(此例暫且命名為counterFactory)中的updateCounter()方法// 可以用于更新參數countercounterFactory.updateCounter().then(function (data) {  // 將新的counter值上傳到localStorage中  $scope.$storage.counter = data.counter;});

(2) 監聽localStorage中的參數變化 - Controller B

$scope.counter = $localStorage.counter;$scope.$watch('counter', function(newVal, oldVal) {  // 監聽變化,并獲取參數的最新值  $log.log('newVal: ', newVal);  });

5. 基于localStorage/sessionStorage和Factory的頁面傳參

由于傳參出現的不同的需求,將不同方式組合起來可幫助你構建低耦合便于擴展和維護的代碼。

舉例:應用的Authentication(授權)。用戶登錄后,后端傳回一個時限性的token,該用戶下次訪問應用,通過檢測token和相關參數,可獲取用戶權限,因而無須再次登錄即可進入相應頁面(Automatically Login)。其次所有的APIs都需要在HTTP header里注入token才能與服務器傳輸數據。此時我們看到token扮演一個重要角色:(a)用于檢測用戶權限,(b)保證前后端數據傳輸安全性。以下實例中使用GitHub - gsklee/ngStorage: localStorage and sessionStorage done right for AngularJS.GitHub - Narzerus/angular-permission: Simple route authorization via roles/permissions

(1)定義一個名為auth.service.js的factory,用于處理和authentication相關的業務邏輯,比如login,logout,checkAuthentication,getAuthenticationParams等。此處略去其他業務,只專注Authentication的部分。

(function() {'use strict';  angular   .module('myApp')   .factory('authService', authService);  /** @ngInject */  function authService($http, $log, $q, $localStorage, PermissionStore, ENV) {   var apiUserPermission = ENV.baseUrl + 'user/permission';   var authServices = {    login: login,    logout: logout,    getAuthenticationParams: getAuthenticationParams,    checkAuthentication: checkAuthentication   };      return authServices;   ////////////////   /**    * 定義處理錯誤函數,私有函數。    * @param {type} xxx    * @returns {*}    * @private    */   function handleError(name, error) {    return $log.error('XHR Failed for ' + name + './n', angular.toJson(error, true));   }      /**    * 定義login函數,公有函數。    * 若登錄成功,把服務器返回的token存入localStorage。    * @param {type} xxx    * @returns {*}    * @public    */   function login(loginData) {    var apiLoginUrl = ENV.baseUrl + 'user/login';          return $http({     method: 'POST',     url: apiLoginUrl,     params: {      username: loginData.username,      password: loginData.password     }    })    .then(loginComplete)    .catch(loginFailed);         function loginComplete(response) {     if (response.status === 200 && _.includes(response.data.authorities, 'admin')) {      // 將token存入localStorage。      $localStorage.authtoken = response.headers().authtoken;      setAuthenticationParams(true);     } else {      $localStorage.authtoken = '';      setAuthenticationParams(false);     }    }         function loginFailed(error) {     handleError('login()', error);    }   }      /**    * 定義logout函數,公有函數。    * 清除localStorage和PermissionStore中的數據。    * @public    */   function logout() {    $localStorage.$reset();    PermissionStore.clearStore();   }   /**    * 定義傳遞數據的setter函數,私有函數。    * 用于設置isAuth參數。    * @param {type} xxx    * @returns {*}    * @private    */   function setAuthenticationParams(param) {    $localStorage.isAuth = param;   }      /**    * 定義獲取數據的getter函數,公有函數。    * 用于獲取isAuth和token參數。    * 通過setter和getter函數,可以避免使用第四種方法所提到的$watch變量。    * @param {type} xxx    * @returns {*}    * @public    */      function getAuthenticationParams() {    var authParams = {     isAuth: $localStorage.isAuth,     authtoken: $localStorage.authtoken    };    return authParams;   }        /*     * 第一步: 檢測token是否有效.    * 若token有效,進入第二步。    *    * 第二步: 檢測用戶是否依舊屬于admin權限.    *    * 只有滿足上述兩個條件,函數才會返回true,否則返回false。     * 請參看angular-permission文檔了解其工作原理https://github.com/Narzerus/angular-permission/wiki/Managing-permissions    */   function checkAuthentication() {    var deferred = $q.defer();        $http.get(apiUserPermission).success(function(response) {     if (_.includes(response.authorities, 'admin')) {      deferred.resolve(true);     } else {      deferred.reject(false);     }    }).error(function(error) {     handleError('checkAuthentication()', error);     deferred.reject(false);    });         return deferred.promise;   }  }})();

(2)定義名為index.run.js的文件,用于在應用載入時自動運行權限檢測代碼。

(function() { 'use strict'; angular  .module('myApp')  .run(checkPermission); /** @ngInject */  /**  * angular-permission version 3.0.x.  * https://github.com/Narzerus/angular-permission/wiki/Managing-permissions.  *   * 第一步: 運行authService.getAuthenticationParams()函數.  * 返回true:用戶之前成功登陸過。因而localStorage中已儲存isAuth和authtoken兩個參數。   * 返回false:用戶或許已logout,或是首次訪問應用。因而強制用戶至登錄頁輸入用戶名密碼登錄。  *  * 第二步: 運行authService.checkAuthentication()函數.  * 返回true:用戶的token依舊有效,同時用戶依然擁有admin權限。因而無需手動登錄,頁面將自動重定向到admin頁面。  * 返回false:要么用戶token已經過期,或用戶不再屬于admin權限。因而強制用戶至登錄頁輸入用戶名密碼登錄。  */ function checkPermission(PermissionStore, authService) {  PermissionStore   .definePermission('ADMIN', function() {    var authParams = authService.getAuthenticationParams();    if (authParams.isAuth) {     return authService.checkAuthentication();    } else {     return false;    }   }); }})();

(3)定義名為authInterceptor.service.js的文件,用于在所有該應用請求的HTTP requests的header中注入token。關于AngularJS的Interceptor,請參看AngularJS

(function() {'use strict';  angular   .module('myApp')   .factory('authInterceptorService', authInterceptorService);  /** @ngInject */  function authInterceptorService($q, $injector, $location) {   var authService = $injector.get('authService');      var authInterceptorServices = {    request: request,    responseError: responseError   };      return authInterceptorServices;      ////////////////      // 將token注入所有HTTP requests的headers。   function request(config) {    var authParams = authService.getAuthenticationParams();    config.headers = config.headers || {};    if (authParams.authtoken) config.headers.authtoken = authParams.authtoken;       return config || $q.when(config);   }      function responseError(rejection) {    if (rejection.status === 401) {     authService.logout();     $location.path('/login');    }    return $q.reject(rejection);    }  }})();

自己總結;(1)ng-click = "isShow"; $sope.isShow = true; (2)配置路由;(3)使用$location.urle(./mainchat/message.html);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av在线免费不卡 | 在线亚洲免费 | 成人影片在线免费观看 | 免费久久久 | 欧美一级毛片一级毛片 | 婷婷亚洲一区二区三区 | 免费一级a毛片在线播放视 日日草夜夜操 | 国产精品99久久久久久久vr | 一级一片免费看 | 欧美日韩在线视频一区 | 日韩视频在线一区二区三区 | 亚洲精品一区国产精品丝瓜 | 好吊色欧美一区二区三区四区 | 午夜神马电影网 | 日韩视频一区二区三区在线观看 | 国产成人精品区一区二区不卡 | 国产艳妇av视国产精选av一区 | 免费在线观看午夜视频 | 99在线精品视频免费观看20 | 欧美成人精品欧美一级乱黄 | 中文字幕一区2区 | 日日爱夜夜操 | 成人不卡一区二区 | 久久激情小视频 | 午夜精品久久久久久久99热浪潮 | www.54271.com| 一本色道久久综合狠狠躁篇适合什么人看 | 偿还电影免费 | 欧美一级精品片在线看 | 欧洲精品视频在线观看 | 国产免费久久久久 | 一级免费在线视频 | 欧美一级性 | 久久影库 | 一级免费在线视频 | 国产九九热视频 | 3344永久免费 | 97人人草| 黄污网址 | 欧美一级毛片美99毛片 | 日韩在线毛片 |