我有一个现有的工厂,可以通过 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/