Angularjs,路线之间的范围

我有一个forms延伸了几页的情况(可能不是很理想,但事实就是这样)。 我想为整个表单填充一个范围,这样,如果用户在两个步骤之间来回切换,就很容易记住这个状态。

所以我需要做的是非常伪代码:

  1. 设置$scope.val = <Some dynamic data>
  2. 点击一个链接,并路由到一个新的模板(可能与相同的控制器)。
  3. $scope.val应该仍然是最后一页上的值。

是以某种方式坚持数据的范围正确的方式去这个,或者有其他的方式? 你甚至可以创build一个在路由之间有一个持久范围的控制器,除了将其保存在数据库中。

您需要使用服务,因为服务将在您的应用程序的整个生命周期中持续存在。

比方说,你想保存有关用户的数据

这是你如何定义服务:

 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"; }); 

该服务将会起作用,但是仅使用普通范围和控制器的逻辑方法是设置您的控制器和元素,以便反映模型的结构。 特别是,您需要一个build立父范围的父元素和控制器。 表单的各个页面应驻留在父项的子视图中。 即使在更新子视图时,父范围仍然存在。

我假设你正在使用UI路由器,所以你可以有嵌套命名的意见。 然后在伪代码中:

 <div ng-controller="WizardController"> <div name="stepView" ui-view/> </div> 

然后WizardController定义了你想要在多页面表单的步骤中保留的范围variables(我称之为“向导”)。 那么你的路线只会更新stepView 。 每个步骤都可以有自己的模板,控制器和范围,但是它们的范围在页面之间丢失。 但WizardController中的作用域保留在所有页面中。

要从子控制器更新WizardController作用域,需要使用类似$scope.$parent.myProp = 'value'语法,或者在WizardController上为每个作用域variables定义一个函数setMyProp 。 否则,如果试图直接从子控制器设置父范围variables,则最终只会在子本身上创build一个新的范围variables,从而隐藏父variables。

有点难以解释,我对缺乏一个完整的例子表示歉意。 基本上你想要一个父控制器,build立一个父范围,这将被保留在你的表单的所有页面。

数据可以通过两种方式在控制器之间传递

  1. $rootScope
  2. 模型

下面的示例演示了使用模型传递值

app.js

 angular.module('testApp') .controller('Controller', Controller) .controller('ControllerTwo', ControllerTwo) .factory('SharedService', SharedService); 

SharedService.js

 function SharedService($rootScope){ return{ objA: "value1", objB: "value2" } } 

//修改控制器A中的值

Controller.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" } 

希望这可以帮助。