角度应用中的哪个位置是存储“共享”数据的好地方

时间:2015-10-22 08:37:14

标签: angularjs separation-of-concerns

这有点跟进了我的“Is it bad practice for an angular directive to request data”问。

我的问题是保存应用程序数据的适当位置? 例如 - 有关当前用户的信息,例如他的名字和他在应用程序中的角色?

不同的区域(在屏幕上)和组件将取决于这些数据(例如 - 侧栏将想知道 curentUser.isAnAdmin helloUser 指令是否会想知道 currentUser.name

这是否意味着currentUser应该放在 $ rootScope 上? 什么应该是检索currentUser的初始数据和刷新此信息的触发器?

我在考虑让几个 ngController 负责在与ngApp相同的html节点范围内设置这些数据,但发现不可能有多个< em> ngController 在单个HTML项目上。

我现在正在考虑使用获取范围对象的方法的多个服务,并将他们负责的数据分配到该范围。   它允许我将 currentUser 的代码与 someOtherSharedAppData 的代码分成两个不同的服务,并从应用程序的主控制器调用它们,从而将数据分配给与之关联的范围应用程序中最顶层的元素 - 这有意义吗?

1 个答案:

答案 0 :(得分:1)

事实上你在这里问了两个问题:

  1. 存储和操作数据的位置?
  2. 何时以及如何使用$ rootScope(与$ scope相比)?
  3. <强> 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变量。正如您在上述讨论中所看到的,还有其他意见,但我认为结论是:它取决于您的应用程序的结构和需求。