Angular--页面间切换及传值的四种方法
1. 基于ui-router的頁面跳轉傳參
(1) 在AngularJS的app.js中用ui-router定義路由,比如現在有兩個頁面,一個頁面(producers.html)放置了多個producers,點擊其中一個目標,頁面跳轉到對應的producer頁,同時將producerId這個參數傳過去。
(2) 在producers.html中,定義點擊事件,比如ng-click="toProducer(producerId)",在ProducersCtrl中,定義頁面跳轉函數 (使用ui-router的$state.go接口):
(3) 在ProducerCtrl中,通過ui-router的$stateParams獲取參數producerId,譬如:
2. 基于factory的頁面跳轉傳參
舉例:你有N個頁面,每個頁面都需要用戶填選信息,最終引導用戶至尾頁提交,同時后一個頁面要顯示前面所有頁面填寫的信息。這個時候用factory傳參是比較合理的選擇(下面的代碼是一個簡化版,根據需求可以不同定制):
3. 基于factory和$rootScope.$broadcast()的傳參
(1) 舉例:在一個單頁中定義了nested views,你希望讓所有子作用域都監聽到某個參數的變化,并且作出相應動作。比如一個地圖應用,某個$state中定義元素input,輸入地址后,地圖要定位,同時另一個狀態下的列表要顯示出該位置周邊商鋪的信息,此時多個$scope都在監聽地址變化。
PS: $rootScope.$broadcast()可以非常方便的設置全局事件,并讓所有子作用域都監聽到。
(2) 在獲取地址的controller中:
(3) 在監聽地址變化的controller中:
4. 基于localStorage或sessionStorage的頁面跳轉傳參
注意事項:通過LS或SS傳參,一定要監聽變量,否則參數改變時,獲取變量的一端不會更新。AngularJS有一些現成的WebStorage dependency可以使用,譬如gsklee/ngStorage · GitHub,grevory/angular-local-storage · GitHub。下面使用ngStorage來簡述傳參過程:
(1) 上傳參數到localStorage - Controller A
(2) 監聽localStorage中的參數變化 - Controller B
作者:Ye Huang
鏈接:http://www.zhihu.com/question/33565135/answer/69651500
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
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() {
轉載于:https://www.cnblogs.com/tzz-ing/p/5881289.html
總結
以上是生活随笔為你收集整理的Angular--页面间切换及传值的四种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python]网络爬虫(12):爬虫框
- 下一篇: Linux 禁ping和开启ping操作