AngularJS工厂用于在控制器之间共享数据

时间:2016-07-07 13:56:18

标签: javascript angularjs controller

我有一个AngularJS应用程序(1.4.10),我需要在两个控制器之间共享一些数据。

所以我做了我的工厂:

.factory('CardsForService', function($http, URL){
    var service = {
        "block_id": '',
        "service_id": ''
    };

    service.save_data = function(block_id, service_id){
        service.block_id = block_id;
        service.service_id = service_id;
    };

    service.get_data = function(){
        return service;
    };

    return service;
})

我在第一个控制器中插入数据:

$scope.open = function(id, type){
    console.log(id +" "+type);
    CardsForService.save_data(id, type);
    ...

我尝试将数据放在另一个控制器中,如下所示:

$scope.$on('$routeChangeSuccess', function() {
    if  (algo_to_used == "service"){
        var data = CardsForService.get_data();
        console.log(data);
    } else {
    }
});

console.log输出:

Object {block_id: "", service_id: ""}

如果我在调用save_data()函数的同一个控制器中尝试相同的get_data()函数,我会得到正确的结果。

我错过了什么?

3 个答案:

答案 0 :(得分:1)

像这样改变工厂

app.factory('CardsForService', function(){
var service = {
    "block_id": '',
    "service_id": ''
};

var save_data = function(block_id, service_id){
    service.block_id = block_id;
    service.service_id = service_id;
};

var get_data = function(){
    return service;
};

return{
   saveData:save_data,
   getData:get_data
}});

在控制器中

app.controller('FirstCtrl',function(CardsForService){
    CardsForService.setData(id, type);
});

app.controller('SecondCtrl', function($scope, CardsForService){
    $scope.data = CardsForService.getData();
});

答案 1 :(得分:0)

听起来这可能是一个时间问题。来自此类服务的数据不具有反应性。这是一个应该帮助可视化它的片段。



var app = angular.module("demo", []);

app.factory("MySvc", function() {
  var data = {};
  data.setData = function(key, value) {
    this[key] = value;
  }
  data.getData = function(key, def) {
    return key in this ? this[key] : def;
  };
  return data;
});

app.controller("test1", ["$scope", "MySvc", "$timeout",
  function($scope, MySvc, $timeout) {
    $timeout(100).then(function() {
      MySvc.setData("foo", "bar");
      $scope.data = MySvc.getData("foo");
    });
  }
]);

app.controller("test2", ["$scope", "MySvc", "$timeout",
  function($scope, MySvc, $timeout) {
    $timeout(500).then(function() {
      $scope.data = MySvc.getData("foo", "baz");
    });
  }
]);

app.controller("test3", ["$scope", "MySvc",
  function($scope, MySvc) {
    $scope.data = MySvc.getData("foo", "asdf");
  }
]);

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js "></script>

<div ng-app="demo">
  <pre ng-controller="test1">Test 1: {{ data }}</pre>
  <pre ng-controller="test2">Test 2: {{ data }}</pre>
  <pre ng-controller="test3">Test 3: {{ data }}</pre>
</div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

好的我解决了这个问题。基本上在我使用此代码重定向到新页面之前:

footer

现在我切换到这段代码:

$window.location.assign('/cards/service');

它正在工作。

唯一的一点是,当我重定向页面时,当Chrome重定向中的控制台刷新每次重新加载时,它都不起作用,现在控制台不会刷新。有人能告诉我这两个功能之间的区别吗?