Angularjs, передавая область между маршрутами
у меня есть ситуация с формой, которая растягивается на несколько страниц (может быть, не идеально, но так оно и есть). Я хотел бы иметь одну область для всей формы, которая заполняется по мере прохождения, так что если пользователь переходит туда и обратно между шагами, легко запомнить состояние.
Так что мне нужно сделать, в очень-псевдо-код:
- Set
$scope.val = <Some dynamic data>
- нажать на ссылку и быть перенаправлен на новый шаблон (вероятно с тем же контроллером).
-
$scope.val
должно быть то же значение, что и на последней странице.
каким-то образом сохраняются данные для области правильный путь, чтобы пойти об этом, или есть какой-то другой способ? Вы даже можете создать контроллер, который имеет сохраненную область между маршрутами, за исключением сохранения его в базе данных, конечно.
3 ответа:
вам нужно использовать сервис, так как сервис будет сохраняться на протяжении всей жизни вашего приложения.
Допустим, вы хотите сохранить данные, относящиеся к пользователю
вот как вы определяете сервис:
app.factory("user",function(){ return {}; });
в вашем первом контроллере:
app.controller( "RegistrationPage1Controller",function($scope,user){ $scope.user = user; // and then set values on the object $scope.user.firstname = "John"; $scope.user.secondname = "Smith"; }); app.controller( "RegistrationSecondPageController",function($scope,user){ $scope.user = user; // and then set values on the object $scope.user.address = "1, Mars"; });
служба будет работать, но логический способ сделать это, используя только обычные области и контроллеры, - настроить ваши контроллеры и элементы так, чтобы они отражали структуру вашей модели. В частности, вам нужен родительский элемент и контроллер, которые устанавливают родительскую область. Отдельные страницы формы должны находиться в представлении, которое является дочерним для родителя. Родительская область сохраняется даже при обновлении дочернего представления.
Я предполагаю, что вы используете ui-router таким образом, вы можете иметь вложенные именованные представления. Затем в псевдокоде:
<div ng-controller="WizardController"> <div name="stepView" ui-view/> </div>
затем WizardController определяет переменные области, которые вы хотите сохранить на всех этапах многостраничной формы (которую я называю "мастером"). Тогда ваши маршруты будут обновляться
stepView
только. Каждый шаг может иметь свои собственные шаблоны, контроллеры и области, но их объемы теряются от страницы к странице. Но области в WizardController сохраняются на всех страницах.обновить WizardController области от дочерних контроллеров, вам нужно будет использовать синтаксис, как
$scope.$parent.myProp = 'value'
или определить функциюsetMyProp
на WizardController для каждой переменной области. В противном случае, если вы попытаетесь установить родительские переменные области непосредственно из дочерних контроллеров, вы просто создадите новую переменную области на самом дочернем элементе, затеняя родительскую переменную.вид трудно объяснить, и я прошу прощения за отсутствие полного примера. В основном вы хотите Родительский контроллер, который устанавливает родительскую область, которая будет сохранена на всех страницах формы.
данные могут передаваться между контроллерами двумя способами
$rootScope
- модель
приведенный ниже пример демонстрирует передачу значений с помощью модели
приложение.js
angular.module('testApp') .controller('Controller', Controller) .controller('ControllerTwo', ControllerTwo) .factory('SharedService', SharedService);
SharedService.js
function SharedService($rootScope){ return{ objA: "value1", objB: "value2" } }
/ / измените значение в контроллере a
.js
function Controller($scope, SharedService){ $scope.SharedService = SharedService; $scope.SharedService.objA = "value1 modified"; }
//доступ к значению controllertwo
ControllerTwo.js
function ControllerTwo($scope, SharedService){ $scope.SharedService = SharedService; console.log("$scope.SharedService.objA"+$scope.SharedService.objA); // Prints "value1 modified" }
надеюсь, что это помогает.