Angularjs,路线之间的范围
我有一个forms延伸了几页的情况(可能不是很理想,但事实就是这样)。 我想为整个表单填充一个范围,这样,如果用户在两个步骤之间来回切换,就很容易记住这个状态。
所以我需要做的是非常伪代码:
- 设置
$scope.val = <Some dynamic data>
- 点击一个链接,并路由到一个新的模板(可能与相同的控制器)。
-
$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立一个父范围,这将被保留在你的表单的所有页面。
数据可以通过两种方式在控制器之间传递
-
$rootScope
- 模型
下面的示例演示了使用模型传递值
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" }
希望这可以帮助。