Угловой фильтр с ответом $http

Мне нужен фильтр, в котором мне нужно сделать вызов $http, а затем вернуть этот ответ. Я пытаюсь использовать угловое обещание, но ничего не работает. Возврат не ждет ответа. Взгляните ниже на мой код. Он возвращает {} , не дожидаясь ответа $http. Мне нужно это только с помощью фильтра. Идея состоит в том, чтобы отделить его от Controller , чтобы его можно было использовать где угодно позже.

.filter('filterXML',['testOne','$sce',function(testOne, $sce){

    return function(url){

       return testOne.getTest(url).then(function(data){
         return data;
        });

    }

 }])


.factory('testOne',  ['$http', function($http){
   return {
   getTest: function(url){
    return $http.get(url).success(function(data){
      console.log(data)
      return data;
    })
  }
 }
}])

Цель: {{ 'http://rss.cnn.com/rss/cnn_topstories.rss' | фильтрXML}}

Таким образом, он вернет все данные из этого RSS-канала.

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

Любая помощь будет оценена. Спасибо


person Anil Sharma    schedule 11.07.2015    source источник
comment
Что бы вы зависали в браузере. Какова ваша цель? Как вы собираетесь использовать фильтр?   -  person a better oliver    schedule 11.07.2015
comment
См. обновленный Вопрос. Цель состоит в том, чтобы использовать фильтр для получения данных xml из строки URL и возврата этих данных. @zeroflagL   -  person Anil Sharma    schedule 11.07.2015
comment
Зачем использовать фильтр для этого?   -  person a better oliver    schedule 11.07.2015
comment
вы не можете возвращать данные из вызовов AJAX, вам нужно установить функции обратного вызова для работы с данными.   -  person vinayakj    schedule 11.07.2015
comment
Я не сторонник фильтра. Но это спрос. Я бы сделал это на своем контроллере. Но мне нужно сделать это, используя только фильтр.   -  person Anil Sharma    schedule 11.07.2015
comment
используйте .then в своем контроллере также для работы с возвращенным объектом обещания, который будет calledback   -  person vinayakj    schedule 11.07.2015


Ответы (3)


Вы не должны делать http-вызовы в фильтре, который просто не предназначен для фильтров. Фильтрам обычно передается массив объектов, и только те объекты, которые соответствуют определенному условию, будут возвращены в новый отфильтрованный массив.

Я думаю, вы хотите пойти на настройку больше, как это ...

angular.module('foo', [])

.controller('someController', ['$scope', '$filter', 'testOne', function($scope, $filter, testOne){

    testOne.getTest('foo/bar').then(function(data){
      $scope.myFilteredData = $filter('filterXML')(data);
    });

}])


 .filter('filterXML', function() {
  return function(input) {
    // the condition on which to filter the input goes here...
    // this is just dummy code you will have to work out your own logic
    return (input === 'XML');
  };
});


.factory('testOne',  ['$http', function($http){
   return {
   getTest: function(url){
    return $http.get(url)
      .success(function(data){
        console.log(data)
        return data;
      });
  }
 }
}])
person Matt Herbstritt    schedule 11.07.2015
comment
Я это знаю, но что, если вы хотите сделать это только с фильтрами? - person Anil Sharma; 11.07.2015
comment
Я понятия не имею. Насколько я знаю, фильтры предназначены для фильтрации данных, и это почти все, для чего они предназначены. - person Matt Herbstritt; 11.07.2015
comment
Идея состоит в том, чтобы держать его отдельно от контроллера, чтобы его можно было использовать где угодно. любая идея без использования контроллера? - person Anil Sharma; 11.07.2015
comment
Отдайте в сервис. Вот для чего нужны сервисы — совместное использование кода между контроллерами. - person geoidesic; 11.07.2015
comment
Фильтры также используются для прогнозирования данных. Вы должны думать о них как о вещах в стиле map/reduce/filter. Они берут набор данных и создают новое представление этих данных специально для представления (они предназначены не только для фильтрации, несмотря на название). - person Dan; 11.07.2015
comment
Идея состоит в том, чтобы держать его отдельно от контроллера, чтобы его можно было использовать где угодно. любая идея без использования контроллера? Слушайте ВСЕХ. Отдайте в сервис/завод! Вы можете использовать его где угодно. И примите ответ Мэтта, потому что он прав. И вы говорите, что если вы хотите сделать это только с фильтрами? -- Как насчет того, чтобы вы обосновали это, вместо того, чтобы не желать принимать действительные ответы. - person jakeforaker; 11.07.2015

Воспользуйтесь услугой. На самом деле вы уже создали один:

.factory('testOne',  ['$http', function($http){
   return {
   getTest: function(url){
    return $http.get(url).success(function(data){
      console.log(data)
      return data;
    })
  }
 }
}])

Теперь просто введите $testOne в свой контроллер, а затем в своем контроллере выполните:

var service = $testOne;
service.getTest('http:/some.url').then(function(response){ /*do something with the response */}); 
person geoidesic    schedule 11.07.2015
comment
Смотрите, я хочу, чтобы мой код был отделен от Controller . В противном случае каждый раз, когда я должен помещать эту строку в каждый контроллер. Поэтому вызывая ее из фильтра, а затем она может работать, где бы мы ни вызывали. - person Anil Sharma; 11.07.2015
comment
Прочтите, что говорит Каспер ниже. Вы лаете не на то дерево с фильтрами. Это все равно, что настаивать на том, что вы хотите ехать по дороге на лодке, потому что вам не нравится заправлять шины. Неправильный инструмент для работы. - person geoidesic; 12.07.2015

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


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


Я предлагаю вам превратить его в сервис, а затем (чтобы иметь возможность использовать его где) выставить методы указанного сервиса, которые вы хотите использовать, на $rootScope* (поскольку, скажем прямо, filter это не то, что вы ищете).


app.service('someServiceName', function ($http) {
  function getStuff (url) {
    return $http.get(url).then(function (res) {
      return res;
    });
  }

  angular.extend(this, {
    getStuff: getStuff
  });
});

app.run(function ($rootScope, someServiceName) {
  $rootScope.getStuff = someServiceName.getStuff;
});

{{ getStuff(url) }}

*: Обычно я не рекомендую выставлять материалы на $root, но вы, похоже, твердо намерены не использовать DI (если я правильно читаю все комментарии/ответы/вопросы) в $scopes, где это будет представлено .

person Kasper Lewau    schedule 11.07.2015