我有一个现有的工厂,通过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;
}
};
});
答案 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
分配给返回的数据对象。它不会覆盖你工厂里的物体。