AngularJS:控制器之间的数据服务

时间:2015-06-10 16:35:16

标签: angularjs angularjs-service

我有一个带有主控制器和嵌套控制器的页面,用于显示有关产品的详细信息。我想在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,它显示正确的数据。但是产品属性没有得到更新。有人可以告诉我,我做错了吗?在获取数据后,两个控制器都无法访问数据。我知道我正在收回一个承诺,但即使在超时检查后,数据也永远不会出现。

1 个答案:

答案 0 :(得分:0)

尝试使用工厂而不是服务。

AngularJS: Factory vs Service vs Provider