javascript - 设置 AngularJS 工厂来共享数据

标签 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;
        }
    };
});

最佳答案

最简单的方法是使用.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;
        }
    };
});

如果您需要/想要 Controller 中的.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 绑定(bind)到工厂中的该对象。当您从 .success 获取数据时,它用于更新该范围对象,该对象实际上是对工厂中对象的引用。

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

关于javascript - 设置 AngularJS 工厂来共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847202/

相关文章:

javascript - 为什么这个对象变量未定义?

javascript - Cordova + AngularJs路由不起作用

javascript - 将 Node.js Express 变量传递给我的静态 javascript 文件

Javascript获取两个符号之间的字符串

javascript - 将引用的样式表动态添加到内联样式

javascript - 即使没有 DOM 断点,Chrome 调试器也会在一个函数处停止

javascript - 在图表内显示标签 - angular.js 和 chart.js

java - Angular JS $http.post 方法导致 JSON 数组格式错误

javascript - Angular promise

javascript - 如何在 Visual Studio .NET 2008 中保留 JavaScript 全局变量的智能感知