angular 应用程序中的哪个位置是存储 "shared" 数据的好地方
where in an angular app is a good place to store "shared" data
这是对我的“”问题的跟进。
我的问题是哪里适合保存应用程序数据?
例如 - 有关当前用户的信息,例如他的姓名和他在应用程序中的角色?
不同的区域(在屏幕上)和组件将取决于此数据(例如 - 边栏将想知道 curentUser.isAnAdmin 和 helloUser指令想知道currentUser.name
这是否意味着 currentUser 应该放在 $rootScope 上?
检索 currentUser 的初始数据和刷新此信息的触发器应该是什么?
我正在考虑让几个 ngController 负责在与 ngApp 相同的 html 节点范围内设置此数据,但发现在单个 HTML 项上不可能有多个 ngController。
我现在正在考虑拥有多个服务,这些服务的方法可以获取范围对象并将它们负责的数据分配到该范围。
它将允许我将 currentUser 的代码与 someOtherSharedAppData 的代码分开到两个不同的服务中,并从应用程序的主控制器调用它们,从而分配数据到与应用中最顶层元素关联的范围 - 这有意义吗?
其实你在这里问了两个问题:
- 在哪里存储和操作数据?
- 何时以及如何使用 $rootScope(与 $scope 相比)?
1)
我会参考this article:
每当数据和方法需要可重用时,我都会编写这样的服务。
angular.module('modelDemo').service("myModel", [function() {
this.list = [what, ever, items, you, have];
this.property= null;
this.setProperty = function(value) {
this.property= value;
};
}]);
请注意,我没有通过您考虑的 $scope。相反,我会在我的控制器中注入服务并像这样绑定 $scope 变量:
$scope.list = myModel.list;
如果需要,您甚至可以绑定到完整模型
$scope.myModel = myModel;
myModel.setPropery(value)
明白了吗?这样所有模型更改将直接可用于相应的视图
{{myModel.property}}
ng-repeat="item in myModel.list"
ng-click="myModel.setProperty(item)"
结论:是的,您应该为您的用户模型和您的 someOtherSharedAppData 模型提供不同的服务。
2)
我会参考这个SO Question。
简而言之:如果您有应该在多个视图中可用的数据,则可以将您的(服务)模型绑定到 $rootScope 变量。正如您在上述讨论中看到的那样,还有其他意见,但我认为结论是:这取决于应用程序的结构和需求。
这是对我的“
我的问题是哪里适合保存应用程序数据? 例如 - 有关当前用户的信息,例如他的姓名和他在应用程序中的角色?
不同的区域(在屏幕上)和组件将取决于此数据(例如 - 边栏将想知道 curentUser.isAnAdmin 和 helloUser指令想知道currentUser.name
这是否意味着 currentUser 应该放在 $rootScope 上? 检索 currentUser 的初始数据和刷新此信息的触发器应该是什么?
我正在考虑让几个 ngController 负责在与 ngApp 相同的 html 节点范围内设置此数据,但发现在单个 HTML 项上不可能有多个 ngController。
我现在正在考虑拥有多个服务,这些服务的方法可以获取范围对象并将它们负责的数据分配到该范围。 它将允许我将 currentUser 的代码与 someOtherSharedAppData 的代码分开到两个不同的服务中,并从应用程序的主控制器调用它们,从而分配数据到与应用中最顶层元素关联的范围 - 这有意义吗?
其实你在这里问了两个问题:
- 在哪里存储和操作数据?
- 何时以及如何使用 $rootScope(与 $scope 相比)?
1) 我会参考this article: 每当数据和方法需要可重用时,我都会编写这样的服务。
angular.module('modelDemo').service("myModel", [function() {
this.list = [what, ever, items, you, have];
this.property= null;
this.setProperty = function(value) {
this.property= value;
};
}]);
请注意,我没有通过您考虑的 $scope。相反,我会在我的控制器中注入服务并像这样绑定 $scope 变量:
$scope.list = myModel.list;
如果需要,您甚至可以绑定到完整模型
$scope.myModel = myModel;
myModel.setPropery(value)
明白了吗?这样所有模型更改将直接可用于相应的视图
{{myModel.property}}
ng-repeat="item in myModel.list"
ng-click="myModel.setProperty(item)"
结论:是的,您应该为您的用户模型和您的 someOtherSharedAppData 模型提供不同的服务。
2) 我会参考这个SO Question。 简而言之:如果您有应该在多个视图中可用的数据,则可以将您的(服务)模型绑定到 $rootScope 变量。正如您在上述讨论中看到的那样,还有其他意见,但我认为结论是:这取决于应用程序的结构和需求。