设置AngularJS工厂以共享数据

时间:2015-08-06 05:05:06

标签: javascript angularjs

我有一个现有的工厂,通过http get。

检索数据
myApp.factory('ModelSpecFactory', ['$http', function ($http) {

    var ModelSpecFactory = {};

    ModelSpecFactory.GetModelSpec = function (modelId,modelSpecListId) {
        return $http({
            method: 'GET',
            url: '/model_spec/GetModelSpec',
            params: { modelId: modelId, modelSpecListId: modelSpecListId }
        });
    };

    return ModelSpecFactory;

}]);

我想要做的是将一个变量添加到工厂,并将http.get的结果放入该变量中。我也希望能够更新变量。 考虑到我想保存从http.get返回的对象而不是名称数据,我将如何将下面的示例合并到我现有的工厂中。

myApp.factory('Data', function () {

    var data = {
        FirstName: ''
    };

    return {
        getFirstName: function () {
            return data.FirstName;
        },
        setFirstName: function (firstName) {
            data.FirstName = firstName;
        }
    };
});

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用.success

myApp.factory('Data', function () {

    var data = {
        FirstName: ''
    };

    return {
        GetModelSpec: function (modelId,modelSpecListId) {
            return $http({
                method: 'GET',
                url: '/model_spec/GetModelSpec',
                params: { modelId: modelId, modelSpecListId: modelSpecListId }
            })
            .success(function(responseData) {
                data.FirstName = responseData.FirstName;
             });
        },
        getFirstName: function () {
            return data.FirstName;
        },
        setFirstName: function (firstName) {
            data.FirstName = firstName;
        }
    };
});

如果您需要/想要控制器中的.success,您可以执行以下操作:

// in factory
...
getData: function() {
  return data;
}

// don't use .success for GetModelSpec here
...

// in controller
$scope.data = GetModelSpec.getData();
$scope.makeCall = function() {
  GetModelSpec.success(function(data) {
    angular.copy(data, $scope.data);
    // need to use angular.copy to keep data bindings in tact
  });
}

这会将$scope.data绑定到工厂中的该对象。当您从.success获取数据时,它用于更新该范围对象,该对象实际上是对工厂中对象的引用。

angular.copy是必要的,因为它实际上将数据从回调复制到对象中。 $scope.data = data会将$scope.data分配给返回的数据对象。它不会覆盖你工厂里的物体。