Angular頁(yè)面?zhèn)鲄⒂卸喾N辦法,根據(jù)不同用例,我舉5種最常見的:
PS: 在實(shí)際項(xiàng)目中,請(qǐng)參照https://github.com/johnpapa/angular-styleguide優(yōu)化您的代碼。
1. 基于ui-router的頁(yè)面跳轉(zhuǎn)傳參
(1) 在AngularJS的app.js中用ui-router定義路由,比如現(xiàn)在有兩個(gè)頁(yè)面,一個(gè)頁(yè)面(producers.html)放置了多個(gè)producers,點(diǎn)擊其中一個(gè)目標(biāo),頁(yè)面跳轉(zhuǎn)到對(duì)應(yīng)的producer頁(yè),同時(shí)將producerId這個(gè)參數(shù)傳過去。
.state('producers', { url: '/producers', templateUrl: 'views/producers.html', controller: 'ProducersCtrl'}).state('producer', { url: '/producer/:producerId', templateUrl: 'views/producer.html', controller: 'ProducerCtrl'})(2) 在producers.html中,定義點(diǎn)擊事件,比如ng-click="toProducer(producerId)",在ProducersCtrl中,定義頁(yè)面跳轉(zhuǎn)函數(shù) (使用ui-router的$state.go接口):
.controller('ProducersCtrl', function ($scope, $state) { $scope.toProducer = function (producerId) { $state.go('producer', {producerId: producerId}); };});(3) 在ProducerCtrl中,通過ui-router的$stateParams獲取參數(shù)producerId,譬如:
.controller('ProducerCtrl', function ($scope, $state, $stateParams) { var producerId = $stateParams.producerId;});2. 基于factory的頁(yè)面跳轉(zhuǎn)傳參
舉例:你有N個(gè)頁(yè)面,每個(gè)頁(yè)面都需要用戶填選信息,最終引導(dǎo)用戶至尾頁(yè)提交,同時(shí)后一個(gè)頁(yè)面要顯示前面所有頁(yè)面填寫的信息。這個(gè)時(shí)候用factory傳參是比較合理的選擇(下面的代碼是一個(gè)簡(jiǎn)化版,根據(jù)需求可以不同定制):
.factory('myFactory', function () { //定義參數(shù)對(duì)象 var myObject = {}; /** * 定義傳遞數(shù)據(jù)的setter函數(shù) * @param {type} xxx * @returns {*} * @private */ var _setter = function (data) { myObject = data; }; /** * 定義獲取數(shù)據(jù)的getter函數(shù) * @param {type} xxx * @returns {*} * @private */ var _getter = function () { return myObject; }; // Public APIs // 在controller中通過調(diào)setter()和getter()方法可實(shí)現(xiàn)提交或獲取參數(shù)的功能 return { setter: _setter, getter: _getter };});3. 基于factory和$rootScope.$broadcast()的傳參
(1) 舉例:在一個(gè)單頁(yè)中定義了nested views,你希望讓所有子作用域都監(jiān)聽到某個(gè)參數(shù)的變化,并且作出相應(yīng)動(dòng)作。比如一個(gè)地圖應(yīng)用,某個(gè)$state中定義元素input,輸入地址后,地圖要定位,同時(shí)另一個(gè)狀態(tài)下的列表要顯示出該位置周邊商鋪的信息,此時(shí)多個(gè)$scope都在監(jiān)聽地址變化。
PS: $rootScope.$broadcast()可以非常方便的設(shè)置全局事件,并讓所有子作用域都監(jiān)聽到。
.factory('addressFactory', ['$rootScope', function ($rootScope) { // 定義所要返回的地址對(duì)象 var address = {}; // 定義components數(shù)組,數(shù)組包括街道,城市,國(guó)家等 address.components = []; // 定義更新地址函數(shù),通過$rootScope.$broadcast()設(shè)置全局事件'AddressUpdated' // 所有子作用域都能監(jiān)聽到該事件 address.updateAddress = function (value) { this.components = angular.copy(value); $rootScope.$broadcast('AddressUpdated'); }; // 返回地址對(duì)象 return address;}]);
新聞熱點(diǎn)
疑難解答
圖片精選