Использовать $rootScope для возврата JSON в AngularJS?

У меня есть эта функция, которая возвращает json с $scope.product_owners = data

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

В настоящее время я вызываю эту функцию во всех моих контроллерах, потому что она используется в них, но мне интересно, можно ли было вызвать один раз. Например, с $rootScope или что-то типа того.

4 ответа

Решение

"Угловой способ" обмена данными между контроллерами заключается в использовании службы:

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;
    });
});

Если один и тот же код используется несколькими контроллерами в вашем приложении, вы можете поместить его в службу, а затем вызвать его из контроллеров:

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);
});

Использование сервисов является предпочтительным способом повторного использования кода между несколькими контроллерами.

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;
}); }

теперь вы можете получить доступ к этим данным из любой области видимости

Вы можете определенно разместить его на $rootScope сохранить несколько звонков.

Вопрос в том, можно ли выполнить один вызов на одном контроллере, можно ли перейти к другому представлению / контроллеру и, таким образом, пропустить вызов?

Если ответ нет, то у вас нет проблем.

Если ответ "да", то у вас должен быть контроллер, обертывающий все остальные, чтобы убедиться, что у вас есть эти данные.

Еще одна возможность - иметь службу, чтобы сохранить product_owners данные, и каждый контроллер может получить доступ к этому серверу для получения данных, и, если они недоступны, получить их по ajax запрос.

Другие вопросы по тегам