0

json我有这个函数返回$scope.product_owners = data

$http({
    url: "php/functions.php",
    method: "GET",
    params: { 
        action: "get_product_owners"
    }
}).success(function(data) {
    $scope.product_owners = data;
});  

目前,我在我的所有控制器中调用这个函数,因为它在它们中使用,但我想知道是否可以调用一次。例如,使用 the$rootScope或类似的东西。

4

4 回答 4

3

跨控制器共享数据的“Angular 方式”是使用服务

app.factory('ProductOwners', function ($http) {
    var service = {
        data: []
    };

    $http({
        url: "php/functions.php",
        method: "GET",
        params: { 
            action: "get_product_owners"
        }
    }).success(function(data) {
        service.data = data;
    });

    return service;
});

然后在每个控制器中注入服务:

app.controller('someCtrl', function (ProductOwners) {
    $scope.product_owners = ProductOwners.data;
});

具有“惰性”评估的不同实现(即,它仅在需要时进行调用,然后提供相同的数据):

app.factory('ProductOwners', function ($http, $q) {
    var data;

    function getDataIfNeeded() {
        if (data !== undefined) {
            return $q.when(data);
        }

        return $http({
            url: "php/functions.php",
            method: "GET",
            params: { 
                action: "get_product_owners"
            }
        }).then(function(response) {
            data = response.data;
            return data;
        });
    }

    return {
        getData: getDataIfNeeded
    };
});

app.controller('someCtrl', function (ProductOwners) {
    ProductOwners.getData().then(function (data) {
        $scope.product_owners = data;
    });
});

更新

另一个不同的实现,带有“惰性”评估并支持传递给的参数getData()

app.factory('GenericService', function ($http, $q) {
    var data = {};

    function getDataIfNeeded(action) {
        action = action || 'default';

        if (data[action] !== undefined) {
            return $q.when(data[action]);
        }

        return $http({
            url: "php/functions.php",
            method: "GET",
            params: { 
                action: action
            }
        }).then(function(response) {
            data[action] = response.data;
            return data[action];
        });
    }

    return {
        getData: getDataIfNeeded
    };
});

app.controller('someCtrl', function (GenericService) {
    GenericService.getData("get_product_owners").then(function (data) {
        $scope.product_owners = data;
    });
});
于 2014-05-09T12:02:38.710 回答
2

如果您的应用程序中的多个控制器使用相同的代码,您可能希望将其放在服务中,然后您可以从控制器中调用它:

myApp.service('products', function($http) {
    this.getProductOwners = function(targetScope) {
        $http({
            url: "php/functions.php",
            method: "GET",
            params: { 
                action: "get_product_owners"
            }
        }).success(function(data) {
            targetScope.product_owners = data;
        });  
    };
});

然后,在您的控制器中:

myApp.controller('MyCtrl', function($scope, products) {
    products.getProductOwners($scope);
});

使用服务是多个控制器之间代码重用的首选方式。

于 2014-05-09T12:03:10.057 回答
2

1-您可以创建一个工厂,然后在控制器内部需要时调用它

yourApp.factory('httpFactory', function($http) {
return {
$http({
    url: "php/functions.php",
    method: "GET",
    params: { 
        action: "get_product_owners"
    }
}).success(function(data) {
    this.product_owners = data;
}); 
}}

然后基本上你把它注入到任何地方,

yourApp.controller('xCtrl', function (httpFactory) {
    $scope.product_owners = httpFactory.product_owners;
});

2-您也可以像这样拥有应用程序的主控制器

<body ng-controller="mainCtrl">

然后把你的代码放进去

yourApp.controller('mainCtrl', function($scope, $http) {
$http({
    url: "php/functions.php",
    method: "GET",
    params: { 
        action: "get_product_owners"
    }
}).success(function(data) {
    $scope.product_owners = data;
}); }

现在您可以从任何子范围访问此数据

于 2014-05-09T12:08:32.327 回答
0

你绝对可以把它放在$rootScope保存多个电话。

问题是 - 如果您将一个呼叫放在一个控制器上,是否可以转到另一个视图/控制器并因此跳过呼叫?

如果答案是否定的,那么您就没有问题。

如果答案是肯定的,那么您应该有一个控制器来包装所有其他控制器以确保您拥有该数据。

另一种可能性是有一个服务来保存product_owners数据,每个控制器都可以访问该服务器以获取数据,如果它不可用,则通过ajax请求获取它。

于 2014-05-09T12:02:58.167 回答