亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97视频在线观看免费| 91久久久久久久久久久久久| zzijzzij亚洲日本成熟少妇| 久久国产一区二区三区| 午夜精品一区二区三区在线播放| 日本一欧美一欧美一亚洲视频| 精品国产欧美成人夜夜嗨| 亚洲美女av在线播放| 国产精品精品视频一区二区三区| 久久国产精品久久国产精品| 欧美激情欧美激情在线五月| 欧美在线www| 国产一区二区丝袜| 精品亚洲一区二区三区在线播放| 国产精品久久久久久影视| 日韩一区二区精品视频| 欧美日韩国产中文字幕| 午夜精品一区二区三区av| 欧美精品激情视频| 97精品久久久中文字幕免费| 日本精品va在线观看| 在线精品91av| 裸体女人亚洲精品一区| 中文一区二区视频| 91国内精品久久| 亚洲欧美国产va在线影院| 高清欧美性猛交| 粉嫩老牛aⅴ一区二区三区| 欧美成人四级hd版| 98精品在线视频| 日韩美女免费观看| 色哟哟亚洲精品一区二区| 日韩在线视频中文字幕| 国产精品高潮在线| 这里只有精品在线观看| 欧美国产精品va在线观看| 欧美精品久久久久久久免费观看| 欧美精品久久久久久久| 亚洲男人天堂网站| 97精品一区二区视频在线观看| 久久成人精品一区二区三区| 欧美片一区二区三区| 日韩在线免费观看视频| 欧美视频不卡中文| 色婷婷综合久久久久中文字幕1| 久久久久国产精品免费网站| 欧美精品激情视频| 日韩av色综合| 欧美二区乱c黑人| 中文字幕在线亚洲| 91精品视频在线看| 中文字幕日韩综合av| 国产精品一二三在线| 91大神在线播放精品| 裸体女人亚洲精品一区| 日韩高清欧美高清| 欧美亚洲在线视频| 91精品中国老女人| 国产精品中文久久久久久久| 国产成人精品999| 国产精品一区二区久久国产| 国产一区视频在线播放| 国产精品久久77777| 国产一区玩具在线观看| 国产精品亚洲激情| 亚洲xxx大片| 在线观看精品自拍私拍| 2023亚洲男人天堂| 亚洲国产精品悠悠久久琪琪| 国产精品日本精品| 欧美大荫蒂xxx| 精品无人区乱码1区2区3区在线| 亚洲天堂网站在线观看视频| 国产精品久久久久久av| 中文字幕精品国产| 国产精品视频永久免费播放| 精品久久久中文| 按摩亚洲人久久| 国产精品女人久久久久久| 97视频在线观看免费高清完整版在线观看| 18一19gay欧美视频网站| 4k岛国日韩精品**专区| 国产91色在线|| 日韩大片免费观看视频播放| 欧美一性一乱一交一视频| 亚洲人成网站999久久久综合| 久久精品国产69国产精品亚洲| 丝袜情趣国产精品| 久久久av一区| 亚洲欧美日韩天堂| 亚洲成人中文字幕| 亚洲欧洲在线观看| 国产精品亚洲综合天堂夜夜| 美女啪啪无遮挡免费久久网站| 久久中文字幕在线视频| 亚洲bt天天射| 久久久www成人免费精品| 国产精品精品久久久| 日韩女优在线播放| 热门国产精品亚洲第一区在线| 都市激情亚洲色图| 日韩欧美综合在线视频| 亚洲欧美中文在线视频| 久久精品国产96久久久香蕉| 欧美一区二区三区……| 日韩中文视频免费在线观看| 8x海外华人永久免费日韩内陆视频| 国产999精品久久久影片官网| 亚洲视频精品在线| 亚洲欧美另类国产| 精品国产一区二区三区久久狼5月| xvideos亚洲| 欧美噜噜久久久xxx| 国外色69视频在线观看| 亚洲黄色av网站| 欧美黄色片在线观看| 亚洲国产一区自拍| 久久婷婷国产麻豆91天堂| 国产91免费看片| 久久久久国产精品免费网站| 成人免费在线视频网站| 国产69精品久久久久久| 日韩成人免费视频| 日韩av免费看| 欧美另类老女人| 亚洲人成在线观看网站高清| 庆余年2免费日韩剧观看大牛| 色噜噜久久综合伊人一本| 在线观看成人黄色| 亚洲jizzjizz日本少妇| 精品国偷自产在线| 精品久久久久久中文字幕一区奶水| 欧美主播福利视频| 午夜伦理精品一区| 欧洲成人在线视频| 九九久久国产精品| 日韩av一区二区在线观看| 欧美激情亚洲自拍| 日韩电视剧免费观看网站| 欧美裸体男粗大视频在线观看| 激情久久av一区av二区av三区| 日韩免费电影在线观看| 欧美在线中文字幕| 久久精品视频导航| 精品电影在线观看| 精品久久久久久久久久久久| 欧美亚洲国产精品| 欧美性猛交xxx| 久久综合五月天| 成人黄色短视频在线观看| 国自产精品手机在线观看视频| 国产精品白嫩美女在线观看| 亚洲精品xxxx| 91在线观看免费高清完整版在线观看| 日本国产高清不卡| 国产综合久久久久| 92裸体在线视频网站| 成人av在线天堂| 国产成人aa精品一区在线播放| 国内精品久久久久影院优| 亚洲最新中文字幕| 亚洲国产成人一区| 亚洲精品视频久久| 国产精品视频大全|