Используйте 1 метод для всех функций, сокращенных до одной функции в angularjs

Здравствуйте, я пытаюсь создать угловое приложение. Итак, вот одна функция, которую я очень часто использую в большинстве своих контроллеров. Могу ли я создать одну функцию или один метод, чтобы я мог использовать эту функцию везде, как мы это делаем в PHP.

Вот функция, которая у меня есть:

var responsePromise = $http.get("http://www.somewebsite.com/api/get_category_index/");
                responsePromise.success(function(data, status, headers, config) {
                    //console.log(data);
                    $scope.PostCategories = data.categories;
                    $scope.spinner = false;
                });
                responsePromise.error(function(data, status, headers, config) {
                    alert("ajax didnt work");
                });

У меня есть несколько контроллеров, например, я подключаю 2 контроллера здесь:

var module = angular.module('app', ['onsen', 'ngSanitize']);

module.controller('directoryControl', function($scope, $http, $rootScope) {
ons.ready(function() {
                $scope.spinner = true;
                var responsePromise = $http.get("http://www.somewebsite.com/api/get_category_index/");
                responsePromise.success(function(data, status, headers, config) {
                    //console.log(data.categories);
                    $scope.PostCategories = data.categories;
                    $scope.spinner = false;
                });
                responsePromise.error(function(data, status, headers, config) {
                    alert("ajax didnt work");
                });

                $scope.setCurrentCategory = function(categoryName){    
                       $scope.CurrentCategory = categoryName;
                     $rootScope.CurrentCategory=$scope.CurrentCategory;       
                }
    });
});

module.controller('directoryCategoryListing', function($scope, $http, $rootScope) {
ons.ready(function() {

                $scope.CurrentCategory = $rootScope.CurrentCategory;
                $scope.spinner = true;
                var CategoryWiseListingPromise = $http.get("http://www.somewebsite.com/api/get_category_posts/?slug="+$rootScope.CurrentCategory+"&count=50");
                CategoryWiseListingPromise.success(function(data, status, headers, config) {
                    //console.log(data.posts);
                    $scope.PostDetails = data.posts;
                    $scope.spinner = false;
                });
                CategoryWiseListingPromise.error(function(data, status, headers, config) {

                    alert("ajax didnt work");
                });
                $scope.setCurrentListing = function(listingName){
                       $scope.CurrentListing = listingName;
                       $rootScope.CurrentListing=$scope.CurrentListing;
                }
    });
});

Поэтому я просто хочу сделать это обычной функцией, которую я могу вызывать из контроллера.

И у меня была проблема с URL. Я хочу определить переменную URL, к которой я могу получить доступ отовсюду во всех контроллерах. Нравиться:

var WebsiteURL = "http://www.somewebsite.com/api/"

Кто-нибудь знает о том, что я могу достичь этого!


person user3201500    schedule 26.04.2015    source источник
comment
Вам нужны службы Angular docs.angularjs.org/guide/services. Вы помещаете свою функцию в объект и возвращаете ее. Затем вы можете включить свою службу в контроллер так же, как вы указали $scope, or $http в качестве параметра.   -  person azium    schedule 26.04.2015
comment
вы используете весь этот код, чтобы спросить, как создать угловой сервис? docs.angularjs.org/guide/services   -  person Claies    schedule 26.04.2015
comment
Да, я думаю, это сервис. Можете ли вы помочь мне здесь с моим примером? Так я могу лучше понять это?   -  person user3201500    schedule 26.04.2015
comment
Да, использование службы angular - это путь. Создайте module.service(...) и переместите все свои вызовы $http в методы службы.   -  person shivas    schedule 26.04.2015
comment
Я думаю, да, это так. Я пытаюсь понять, как это сделать. Давай попробуем.   -  person user3201500    schedule 26.04.2015


Ответы (2)


Вы можете добиться этого, создав фабрику и поместив туда этот метод, и получить доступ к этому методу, внедрив фабричную зависимость

app.factory('DataService', fucntion($http){
  var baseUrl = "http://www.somewebsite.com/api";
  var getData = function(extendedUrl, successCallback, errorCallback){
     return $http.get(baseUrl + extendedUrl).success(successCallback).error(errorCallback);
  }
  return { 
    getData: getData
  }
});

Контроллер

module.controller('directoryCategoryListing', function($scope, $http, $rootScope, DataService) {
    ons.ready(function() {

        $scope.CurrentCategory = $rootScope.CurrentCategory;
        var successCallback = function(data, status, headers, config) {
            //console.log(data.posts);
            $scope.PostDetails = data.posts;
            $scope.spinner = false;
        };

        var errorCallback = function(data, status, headers, config) {
             alert("ajax didnt work");
        }
        DataService.getData("/get_category_posts/?slug=" + $rootScope.CurrentCategory + "&count=50", successCallback, errorCallback);
        $scope.setCurrentListing = function(listingName) {
            $scope.CurrentListing = listingName;
            $rootScope.CurrentListing = $scope.CurrentListing;
        }
    });
});

В контроллере вы можете сделать доступ, введя имя службы/фабрики, а затем получить доступ к доступному в нем методу.

person Pankaj Parkar    schedule 26.04.2015
comment
return {getData: getData} Не могли бы вы помочь мне с этим? Почему вы используете getData: getData? здесь - person user3201500; 26.04.2015
comment
потому что я выставляю метод getData из службы, и, кроме того, мы можем добавить больше функций внутри службы, вам нужно посмотреть, как написать службу/фабрику stackoverflow.com/questions/15666048/ - person Pankaj Parkar; 26.04.2015
comment
@user3201500 user3201500 посмотрите на мое редактирование, теперь вам нужно только передать функцию successCallback и errorCallback, которая вызовет success и error ajax ... дайте мне знать, если вам нужно что-то еще - person Pankaj Parkar; 26.04.2015
comment
Потрясающий! Я четко понял концепцию, и это действительно мне очень помогло. Большое спасибо! - person user3201500; 26.04.2015
comment
@ user3201500 рад слышать, что это помогло, спасибо :) - person Pankaj Parkar; 26.04.2015

Вот как вы можете реорганизовать свой код:

var module = angular.module('app', ['onsen', 'ngSanitize']);

module.service('DirectoryService',function(){
    var self = this;

    self.GetCategoryIndex = function(scope){
    $http.get("http://www.somewebsite.com/api/get_category_index/").success(function(data, status, headers, config) {
                //console.log(data.categories);
                scope.PostCategories = data.categories;
                scope.spinner = false;
            }).error(function(data, status, headers, config) {
                alert("ajax didnt work");
            });

}
});
module.controller('directoryControl', function($scope, $http,     $rootScope,DirectoryService) {
ons.ready(function() {
            $scope.spinner = true;

            DirectoryService.GetCategoryIndex($scope);

            $scope.setCurrentCategory = function(categoryName){    
                   $scope.CurrentCategory = categoryName;
                 $rootScope.CurrentCategory=$scope.CurrentCategory;       
            }
});
});
person shivas    schedule 26.04.2015
comment
Ладно это хорошо. Но если я хочу использовать .success и .error как метод для функции в module.service, могу ли я это сделать? - person user3201500; 26.04.2015
comment
Вы можете, но тогда вы не сможете что-то делать со своими переменными $scope из службы. По крайней мере, не напрямую - person shivas; 26.04.2015
comment
Могу ли я использовать здесь $scope вместо var self.GetCategoryIndex? Как $scope.GetCategoryIndex - person user3201500; 26.04.2015
comment
Я не думаю, что вы можете использовать $scope в сервисе. Позвольте мне проверить - person shivas; 26.04.2015
comment
Круто получилось. А как насчет $scope? Как я могу сделать это работоспособным, если я использую всю функцию .success и .error вместе. Должен ли я установить какую-то пару KEY и VALUE? Будет ли это хорошим вариантом? - person user3201500; 26.04.2015
comment
Вы пытаетесь перенести всю логику на службу? - person shivas; 26.04.2015
comment
Да, я хочу перенести все в сервис. Поэтому мне не нужно постоянно указывать много кода. как методы успеха и ошибки. И есть ли разница сервис/завод? - person user3201500; 26.04.2015
comment
Служба и фабрика - это одно и то же. Все они являются службами в angular. Обычно мне нравится держать обещания в контроллере, чтобы я мог обрабатывать .success и .error в контроллере. Но если вы хотите перенести его в сервис, я обновлю приведенный выше код. - person shivas; 26.04.2015
comment
var self.GetCategoryIndex = function(scope){ могу ли я передать еще одно значение этой функции? Как и URL-адрес, я перейду из DirectoryService.GetCategoryIndex($scope, URL); это возможно? так что я могу использовать URL напрямую - person user3201500; 26.04.2015
comment
Я предполагаю, что в var self.GetCatIndex есть ошибка, показывающая эту ошибку. Uncaught SyntaxError: Неожиданный токен. angular.js:80 Uncaught Error: [$injector:modulerr] Не удалось создать экземпляр приложения модуля из-за: Ошибка: [$injector:nomod] Модуль «приложение» недоступен! Вы либо неправильно написали имя модуля, либо забыли его загрузить. При регистрации модуля убедитесь, что вы указали зависимости в качестве второго аргумента. - person user3201500; 26.04.2015
comment
И да, когда я удаляю self. тогда он тоже убирает ошибку. Но когда я загружаю контроллер. Я получаю эту ошибку TypeError: ajaxCall.GetCatIndex не является функцией - person user3201500; 26.04.2015
comment
Я меняю имена здесь. - person user3201500; 26.04.2015
comment
Извините, у меня была опечатка, это должно было быть var self = this; а затем self.GetCategoryIndex = function(scope)..... и да, вы можете добавить дополнительные параметры в сервисную функцию - person shivas; 26.04.2015
comment
переменная самость = это; self.GetCategoryIndex все та же ошибка. :( - person user3201500; 26.04.2015
comment
TypeError: ajaxCall.GetCatIndex не является функцией - person user3201500; 26.04.2015
comment
Ок решил. Он просил $http. Теперь я понял. :) Большое спасибо за постоянную помощь. - person user3201500; 26.04.2015