2014-09-15 3 views
33

Я использую ng-repeat для отображения коллекции значений. Параметры моего фильтра меняются в соответствии с вызовом ajax на сервер. Как обновить ng-repeat после получения параметров фильтра?AngularJS - refresh ng-repeat

js fiddle

Шаблон

<div> 
<div data-ng-controller="myCtrl"> 
    <ul> 
     <li data-ng-repeat="item in values | filter:filterIds()"> 
      <code>#{{item.id}}</code> Item 
     </li> 
    </ul> 
    </div> 
</div> 
<button ng-click="loadNewFilter()"> filter now</button> 

Угловая

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

app.controller('myCtrl', function ($scope) { 
    $scope.values = [ 
    {id: 1}, 
    {id: 2}, 
    {id: 3}, 
    {id: 4}, 
    {id: 5}, 
    {id: 6} 
    ]; 

    $scope.filter = [1,2,3,4,5,6]; 

    $scope.filterIds = function (ids) { 
     return function (item) { 
      var filter = $scope.filter; 
      return filter.indexOf(item.id) !== -1;   
     } 
    } 

    $scope.loadNewFilter = function(){ 
    $scope.filter = [1,2,3];  
    } 
}); 

ответ

34

Вы должны сказать, что угловые значения имеют изменения:

$scope.loadNewFilter = function(){ 
    $scope.filter = [1,2,3];  
    $scope.$apply(); 
} 
+0

Нет, она не работает, смотрите: [jsfiddle] (http://jsfiddle.net/6nssg30q/3/) – user1477955

+3

@ user1477955: HTTP: //jsfiddle.net/6nssg30q/6/ кнопка находится вне объема контроллера. Теперь он работает – RahulB

+0

. Это решило проблему, с которой я сталкивался, добавляя элементы в массив через обратный вызов, не обновляя ng-repeat автоматически. Вызов $ source. $ Apply(); сразу после добавления нового элемента, вызванного его появлением, просто отлично. –

1

После получения вашего фильтра с именем $ scope. $ Apply() следующим образом: Он обновляет вашу область.

$scope.$apply(function() { 
    // your code 
}); 
6

Вы поместили <button ng-click="loadNewFilter()"> filter now</button> из области видимости контроллера.

4

В моем случае у меня был trackBy в моем ng-repeat и пришлось удалить его, чтобы обновить его.

+0

Точно такая же проблема для меня! Спасибо - я бы никогда не ожидал, что tracyBy будет * причиной * проблемы - я только знал, что он решает проблемы раньше! – Dave

+0

@Meliodas вы можете использовать $ index без trackBy –