본 글의 예시에서는 참고용으로 Angular JS 페이지 간 전환 및 값 전달 방법을 공유합니다.
1 . ui-router 전송 매개변수를 기반으로 한 페이지 이동
(1) AngularJS의 app.js에서 경로를 정의하려면 이제 한 페이지(producers.html)에 여러 생산자를 배치합니다. 대상 중 하나에서 페이지가 해당 생산자 페이지로 이동하여 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. 공장 기반 페이지 점프 매개변수
예: N개의 페이지가 있고 각 페이지에는 사용자가 정보를 입력해야 하며 최종적으로 제출할 마지막 페이지로 사용자를 안내하는 동시에 후자 페이지에 정보가 표시되어야 합니다. 모든 이전 페이지에서 채워졌습니다. 현재로서는 팩토리를 사용하여 매개변수를 전달하는 것이 더 합리적인 선택입니다(다음 코드는 단순화된 버전이므로 필요에 따라 사용자 정의할 수 있습니다).
.factory('myFactory', function () { //定义factory返回对象 var myServices = {}; //定义参数对象 var myObject = {}; /** * 定义传递数据的set函数 * @param {type} xxx * @returns {*} * @private */ var _set = function (data) { myObject = data; }; /** * 定义获取数据的get函数 * @param {type} xxx * @returns {*} * @private */ var _get = function () { return myObject; }; // Public APIs myServices.set = _set; myServices.get = _get; // 在controller中通过调set()和get()方法可实现提交或获取参数的功能 return myServices; });
3. 팩토리 및 $rootScope.$broadcast()를 기반으로 매개변수 전달
(1) 예: 중첩된 뷰는 단일 페이지에 정의되며 모든 뷰를 원합니다. 특정 매개변수의 변경을 수신하고 해당 조치를 취하는 하위 범위. 예를 들어, 지도 애플리케이션에서 입력 요소는 특정 $state에 정의되어 있으며, 주소를 입력한 후 지도의 위치를 지정하는 동시에 다른 상태의 목록에 주변 상점에 대한 정보가 표시되어야 합니다. 현재 여러 $scope가 주소 변경을 모니터링하고 있습니다.
PS: $rootScope.$broadcast()는 전역 이벤트를 설정하고 모든 하위 범위에서 이를 수신하도록 하는 데 매우 편리할 수 있습니다.
.factory('addressFactory', ['$rootScope', function ($rootScope) { // 定义所要返回的地址对象 var address = {}; // 定义components数组,数组包括街道,城市,国家等 address.components = []; // 定义更新地址函数,通过$rootScope.$broadcast()设置全局事件'AddressUpdated' // 所有子作用域都能监听到该事件 address.updateAddress = function (value) { this.components = value.slice(); $rootScope.$broadcast('AddressUpdated'); }; // 返回地址对象 return address; }]);
(2) 주소를 얻는 컨트롤러에서:
// 动态获取地址,接口方法省略 var component = { addressLongName: xxxx, addressShortName: xxxx, cityLongName: xxxx, cityShortName: xxxx }; // 定义地址数组 $scope.components = []; $scope.$watch('components', function () { // 将component对象推入$scope.components数组 components.push(component); // 更新addressFactory中的components addressFactory.updateAddress(components); });
(3) 주소 변경을 모니터링하는 컨트롤러에서:
// 通过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. sessionStorage 페이지 점프 매개변수 전송
참고: LS 또는 SS를 통해 매개변수를 전송할 때 변수를 모니터링해야 합니다. 그렇지 않으면 매개변수가 변경될 때 변수를 얻는 끝이 업데이트되지 않습니다. AngularJS에는 gsklee/ngStorage · GitHub, grevory/angular-local-storage · GitHub와 같이 사용할 수 있는 미리 만들어진 WebStorage 종속성이 있습니다. 다음은 ngStorage를 사용하여 매개변수 전달 프로세스를 간략하게 설명합니다.
(1) localStorage에 매개변수 업로드 - 컨트롤러 A
// 定义并初始化localStorage中的counter属性 $scope.$storage = $localStorage.$default({ counter: 0 }); // 假设某个factory(此例暂且命名为counterFactory)中的updateCounter()方法 // 可以用于更新参数counter counterFactory.updateCounter().then(function (data) { // 将新的counter值上传到localStorage中 $scope.$storage.counter = data.counter; });
(2) localStorage의 매개변수 변경 모니터링 - 컨트롤러 B
$scope.counter = $localStorage.counter; $scope.$watch('counter', function(newVal, oldVal) { // 监听变化,并获取参数的最新值 $log.log('newVal: ', newVal); });
위는 Angular 페이지 간 전환과 값 전달의 4가지 방법에 대한 내용입니다. 관련 내용 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!