AngularJS : 控制器之间的数据服务
AngularJS : Service for data between controllers
我有一个页面,其中包含一个主控制器和一个用于显示产品详细信息的嵌套控制器。我想使用 angular 中的服务来调用服务器、检索数据对象并保存该数据对象。主控制器将调用服务来获取数据,详细信息控制器需要知道它已更新,然后访问数据。我的服务如下所示:
.service("productService", function ($http, $q) {
var product = {};
//interface that is returned
return ({
fetchProduct: fetchProduct,
clearProduct: clearProduct,
product: product
});
function fetchProduct(ID) {
var request = $http({
method: "get",
url: "/online/productdata.ashx?itemID=" + ID,
params: {
action: "get"
}
});
return (request.then(handleSuccess, handleError));
};
function clearProduct() {
product = {};
};
// Transform the error response, unwrapping the application dta from
// the API response payload.
function handleError(response) {
// The API response from the server should be returned in a
// nomralized format. However, if the request was not handled by the
// server (or what not handles properly - ex. server error), then we
// may have to normalize it on our end, as best we can.
if (
!angular.isObject(response.data) ||
!response.data.message
) {
return ($q.reject("An unknown error occurred."));
}
// Otherwise, use expected error message.
return ($q.reject(response.data.message));
};
// I attempt to transform the successful response and unwrap the application data
// from the API response payload.
function handleSuccess(response) {
product = response.data;
console.log("Found Data: " + angular.toJson(response.data))
return (response.data);
};
})
在我的主控制器中,我为服务设置了一个范围对象,如下所示:
$scope.SelectedProduct = 产品服务;
当用户点击按钮显示产品时,它通过 $scope 句柄调用:
$scope.SelectedProduct.fetchProduct(ID);
详细信息控制器对 $scope.SelectedProduct 具有相同的分配。我是使用服务的新手,但据我了解,angular 会绑定到服务对象,对 属性 产品的更改会触发绑定到任何更新。这并没有发生——事实上我确实在获取操作后看到了数据。在服务中,我在返回的数据上有一个 console.log,它显示了正确的数据。但是,产品 属性 没有得到更新。有人可以告诉我我做错了什么吗?获取数据后,两个控制器都无法访问数据。我知道我正在收回承诺,但即使在超时检查后数据也永远不会存在。
尝试使用工厂而不是服务。
我有一个页面,其中包含一个主控制器和一个用于显示产品详细信息的嵌套控制器。我想使用 angular 中的服务来调用服务器、检索数据对象并保存该数据对象。主控制器将调用服务来获取数据,详细信息控制器需要知道它已更新,然后访问数据。我的服务如下所示:
.service("productService", function ($http, $q) {
var product = {};
//interface that is returned
return ({
fetchProduct: fetchProduct,
clearProduct: clearProduct,
product: product
});
function fetchProduct(ID) {
var request = $http({
method: "get",
url: "/online/productdata.ashx?itemID=" + ID,
params: {
action: "get"
}
});
return (request.then(handleSuccess, handleError));
};
function clearProduct() {
product = {};
};
// Transform the error response, unwrapping the application dta from
// the API response payload.
function handleError(response) {
// The API response from the server should be returned in a
// nomralized format. However, if the request was not handled by the
// server (or what not handles properly - ex. server error), then we
// may have to normalize it on our end, as best we can.
if (
!angular.isObject(response.data) ||
!response.data.message
) {
return ($q.reject("An unknown error occurred."));
}
// Otherwise, use expected error message.
return ($q.reject(response.data.message));
};
// I attempt to transform the successful response and unwrap the application data
// from the API response payload.
function handleSuccess(response) {
product = response.data;
console.log("Found Data: " + angular.toJson(response.data))
return (response.data);
};
})
在我的主控制器中,我为服务设置了一个范围对象,如下所示: $scope.SelectedProduct = 产品服务;
当用户点击按钮显示产品时,它通过 $scope 句柄调用: $scope.SelectedProduct.fetchProduct(ID);
详细信息控制器对 $scope.SelectedProduct 具有相同的分配。我是使用服务的新手,但据我了解,angular 会绑定到服务对象,对 属性 产品的更改会触发绑定到任何更新。这并没有发生——事实上我确实在获取操作后看到了数据。在服务中,我在返回的数据上有一个 console.log,它显示了正确的数据。但是,产品 属性 没有得到更新。有人可以告诉我我做错了什么吗?获取数据后,两个控制器都无法访问数据。我知道我正在收回承诺,但即使在超时检查后数据也永远不会存在。
尝试使用工厂而不是服务。