在多个控制器或视图中使用ng-model
在多个控制器或视图中使用ng-model
假设我的导航栏(navbar)位于导航栏控制器(navbar controller),而我正在另一个控制器(controller)中进行一些值操作,我如何能够更新导航栏的值呢?
以下是我创建的一个小例子,用于表达我的问题:
{{number}} {{number || 0}} angular.module("app", []) .controller("ctrl", ["$scope", function($scope){ $scope.number = 1; $scope.increment = function(){ $scope.number++; } }]) .controller("ctrl2", ["$scope", function($scope){ }]);
我想要更新 ctrl2 控制器的 {{number}} 值。
在Angular中,最干净的共享数据的方式是使用服务(Service)。以下是根据你的示例更改的代码。基本上,你将要共享的真正数据保存在服务实例中,服务是一个单例,然后在服务中创建setter和getter以及递增函数。然后,从两个控制器中删除本地的$scope.number。在控制器中无法将数据绑定到服务中的数据,但是可以将getter方法绑定到$scope,这样你就可以在视图中调用getter方法。
angular.module("app", []) .factory("sharedModelService", function() { var model = this; var number = 0; model.initNumber = function(value) { return number = value; } model.getNumber = function() { return number; } model.increment = function() { return ++number; } return model; }) .controller("ctrl", ["$scope", "sharedModelService", function($scope, sharedModelService) { sharedModelService.initNumber(1); $scope.getNumber = sharedModelService.getNumber; $scope.increment = function() { sharedModelService.increment(); } }]) .controller("ctrl2", ["$scope", "sharedModelService", function($scope, sharedModelService) { $scope.getNumber = sharedModelService.getNumber; }]);
{{getNumber()}}{{getNumber() || 0}}
在这个例子中,我们使用了一个名为sharedModelService的服务来共享数据。这个服务有一个变量number,初始值为0。我们在ctrl控制器中通过sharedModelService.initNumber(1)来将number的值设置为1,并通过$scope.getNumber = sharedModelService.getNumber将sharedModelService.getNumber()方法绑定到$scope上。在视图中,我们通过{{getNumber()}}来显示number的值,并通过ng-click="increment()"来调用sharedModelService.increment()方法来递增number的值。在ctrl2控制器中,我们也将sharedModelService.getNumber()方法绑定到$scope上,并在视图中显示number的值。
这样,我们就通过服务成功地在多个控制器和视图之间实现了数据共享。不再需要使用$watch来监听数据变化。
问题的原因是想要在多个控制器之间共享成员。解决方法是创建一个父控制器,通过在HTML中使用ng-controller指令将子控制器嵌套在父控制器中,从而实现共享成员的目的。然而,这种方法存在一个限制,即如果有多个页面和用户访问控制,则需要使用多个父控制器,这会导致代码变得复杂和难以维护。
为了避免使用多个父控制器,我们可以使用服务(service)来实现共享数据。服务是AngularJS中的一种特殊类型的对象,可以在多个控制器之间共享数据和功能。我们可以创建一个名为"sharedData"的服务,并在需要共享数据的控制器中注入这个服务。然后,我们可以通过服务的方法来修改和访问共享数据。
下面是使用服务来实现共享数据的示例代码:
angular.module("app", []) .service("sharedData", function(){ this.number = 0; this.increment = function(){ this.number++; }; }) .controller("ctrl", ["$scope", "sharedData", function($scope, sharedData){ $scope.sharedData = sharedData; }]) .controller("ctrl2", ["$scope", "sharedData", function($scope, sharedData){ $scope.sharedData = sharedData; }]);
然后在HTML中使用这些控制器:
{{sharedData.number}}{{sharedData.number || 0}}
使用服务可以避免使用多个父控制器,使代码更加简洁和易于维护。同时,通过服务可以方便地对共享数据进行修改和访问,提高了代码的可读性和可扩展性。