Пользовательский фильтр с использованием app.filter вызывается до того, как модель станет доступной

0

Я пытаюсь добавить свой собственный фильтр, чтобы отфильтровать основной список на основе локалей. Чтобы получить основной список, я помещаю вызов ajax. При попытке отладки это выглядит как app.filter похоже, выполняется до того, как ajax предоставит ответ. Ниже приведена ошибка, которую я получаю:

angular.js: 15712TypeError: Невозможно прочитать длину свойства undefined at messageSelectionCtrl.js: 57 at fn (eval at (angular.js: 14059),: 4: 360) в Object. (angular.js: 16730) при r. $ digest (angular.js: 18747) при r. $ apply (angular.js: 19054) при g (угловой.js: 13192) при T (угловой.js: 14196) при XMLHttpRequest.w.onload(angular.js: 14364)

Здесь просмотрите код о том, что я пытался каждый:

messageSelectionCtrl.js:

//getMessageSelectionConfigs is the service used to make http request and the successhandler and errorhandler defined in controller.
app.controller('messageSelectionCtrl',['$scope','getMessageSelectionConfigs', 'filterData', '$log','errorService', function($scope, getMessageSelectionConfigs, filterData, $log, errorService){

    $scope.filterData =  filterData;
    ....
    ...

    //service call to fetch message selection config 
    getMessageSelectionConfigs.get(data).then(messageSelectionSuccessHandler,messageSelectionErrorHandler);

    ......
}]);

.......
.....

app.filter('filterByLocale', function(){
  return function (messageSelectionList, locale){
     var filtered = [];
     for (var i=0; i<messageSelectionList.length; i++){
         var item= messageSelectionList[i];
         if(item.locale === locale){
           filtered.push(item);
         }
     }
     return filtered;
  };
});

.....
..

messageSelectionTemplate.html

<div ng-repeat = "item in messageSelectionList | filterByLocale: filterData.locale">

mainCtrl.js

app.factory('filterData', function(){
  return {
    locale : ''
  };
});

функция messageSelectionSuccessHandler выполняется после messageSelectionSuccessHandler ошибки. Это странно, потому что представление должно запускаться, как только ng-repeat имеет некоторую модель, чтобы зацикливаться. Пожалуйста, дайте мне знать, что я пропал без вести, или любые указатели будут полезны.

Теги:
http

1 ответ

1
Лучший ответ

Сначала инициализируйте messageSelectionList = [], чтобы он никогда не был неопределенным. Цикл будет обновляться с данными после их получения.

И игнорировать пустые фильтры -

app.filter('filterByLocale', function(){
  return function (messageSelectionList, locale){
    if(locale){
      var filtered = [];
      for (var i=0; i<messageSelectionList.length; i++){
      var item= messageSelectionList[i];
      if(item.locale === locale){
         filtered.push(item);
       }
     return filtered;
    }
    return messageSelectionList
  }
  };
});
  • 0
    ммм ... Это удаляет ошибку, которая в порядке, но в представлении ничего не заполняется. Это потому, что параметр фильтра инициализируется пустой строкой? Отладка предполагает, что filterByLocale возвращает пустой массив. Я хочу, чтобы сначала отображался список, а при изменении локали представление снова должно измениться.
  • 0
    Может быть, поставить if (фильтр) вокруг кода фильтра и игнорировать пустые фильтры и вернуть неизмененные данные
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню