我有一个带有主控制器和嵌套控制器的页面,用于显示有关产品的详细信息。我想在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 = productService;
当用户点击按钮显示产品时,通过$ scope句柄调用它: $ scope.SelectedProduct.fetchProduct(ID);
详细信息控制器对$ scope.SelectedProduct具有相同的分配。我是新手使用服务,但我理解的是,angular将绑定到服务对象,对属性产品的更改将触发绑定到任何更新。这没有发生 - 实际上我确实在获取操作后看到了数据。在服务中,我在返回的数据上有一个console.log,它显示正确的数据。但是产品属性没有得到更新。有人可以告诉我,我做错了吗?在获取数据后,两个控制器都无法访问数据。我知道我正在收回一个承诺,但即使在超时检查后,数据也永远不会出现。