更好的设计,用于将数据传递到其他ng-view并将其持久化到控制器

Fai*_*bid 29 angularjs

我开始在AngularJS开发.我很困惑这是否是在我的部分视图之间传递数据的正确设计.

现在我有一个加载页面,我做了一些请求.

function PeopleController($scope,$http,$location){
    $http.get('/location/-79.18925/43.77596').
    success(function(data){
      $scope.savePeopleResponse(data);
      $location.url('/test');
    });
}
Run Code Online (Sandbox Code Playgroud)

然后在为/ test加载的视图中

我只是打电话

<div ng-controller="resultController">
    <div class="blueitem">{{getResultForPeople()|json}}</div>
</div>
Run Code Online (Sandbox Code Playgroud)

[resultController]

    function resultController($scope){
      $scope.getResultForPeople = function(){
     return $scope.getPeopleResponse();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且rootPcope中的savePeopleResponse和getResultForPeople被"缓存"

app.run(function($rootScope) {
  var peopleResponse = {};
  $rootScope.savePeopleResponse = function(data) {
   peopleResponse = data;
   console.log(data);
  }

  $rootScope.getPeopleResponse = function(){
    return peopleResponse;
  }
});
Run Code Online (Sandbox Code Playgroud)

现在你可以看到,如果这个应用程序变得越来越大,这将变得非常混乱.处理数据的最佳方法是什么,以便它跨控制器持续存在?

Glo*_*opy 55

您可以通过创建自己的服务来跨控制器持久保存数据,如本博客中所述.您也可以参考这个问题.

你的情况,你可以将你savePeopleResponsegetPeopleResponse成服务,然后注入服务为您想访问任何控制器.

angular.module('myApp', [])
    .factory('peopleService', function () {
        var peopleResponse = {};

        return {
            savePeopleResponse:function (data) {
                peopleResponse = data;
                console.log(data);
            },
            getPeopleResponse:function () {
                return peopleResponse;
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

你的控制器是这样的:

function resultController ($scope, peopleService) {
    $scope.getResultForPeople = peopleService.getPeopleResponse;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码示例,请确保包含 ng-app="myApp"

  • 它类似,但使用Angular的依赖注入,可以轻松选择要在每个控制器中使用的服务,而不会使rootScope混乱(促进关注点的分离).您还可以为控制器的单元测试注入模拟服务,这可以使测试更容易.您还可以将$ http访问权限移动到服务中,以便获取/保存在一个位置,而不是跨多个控制器. (14认同)
  • 为什么决定使用服务而不是工厂?服务是否意味着作为对象的初始化者?这里用于模块模式.我是Angular的新手,所以可能会错误地理解它. (3认同)