Обновить смарт-таблицу после изменения содержимого

У меня есть массив объектов, которые я отображаю с помощью директивы st-table.

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

Я считаю, что причина этого в том, что smart-table отслеживает длину массива, но не выполняет глубокое сравнение, чтобы увидеть, изменились ли значения внутри какого-либо из объектов.

Что я могу сделать, чтобы решить эту проблему?

редактировать: добавлен код:

angular.module('myApp', ['smart-table'])
    .controller('mainCtrl', ['$scope', '$timeout',
    function ($scope, $timeout) {

        $scope.rowCollection = [
        {
          name: "sth odd",
          number: 1
        },
        {
          name: "sth even",
          number: 1
        }
        ];

        $scope.displayedCollection = [].concat($scope.rowCollection);

        function changeNumber(){
          $timeout(function(){
            $scope.rowCollection[1].number = $scope.rowCollection[1].number === 1 ? 2 : 1;
            changeNumber();
          }, 1000);
        }

        changeNumber();


    }
]);

http://plnkr.co/edit/IVYy5WrsiEJSRXZCqY9z?p=preview

Обратите внимание, что когда вы ищете, например, номер «2», представление не обновляется, хотя свойство второго элемента иногда равно «2», а иногда нет.


person kihu    schedule 04.11.2015    source источник
comment
Можете ли вы опубликовать код, который воспроизводит эту проблему?   -  person svarog    schedule 04.11.2015
comment
@svarog, добавил код и рабочий пример   -  person kihu    schedule 05.11.2015


Ответы (2)


Нашел для вас решение: вместо использования st-search используйте обычный ng-model, а затем отфильтруйте по значению ng-model. затем в фильтре ng-repeat по этому значению

так вместо этого

<input st-search="number" placeholder="search for number" class="input-sm form-control" type="search"/>
...

<tr ng-repeat="row in displayedCollection">
    <td>{{row.name}}</td>
    <td>{{row.number}}</td>
</tr>

сделай это

<input ng-model="searchMe" placeholder="search for number" class="input-sm form-control" type="search"/>
....

<tr ng-repeat="row in filterd = (displayedCollection | filter: searchMe)">
    <td>{{row.name}}</td>
    <td>{{row.number}}</td>
</tr>

вот plunker, введите 2 и посмотрите, как он каждый раз повторяет фильтрацию

person svarog    schedule 08.11.2015

Чтобы обновить смарт-таблицу, вы можете добавлять или удалять элементы, как вы знаете, или использовать новый массив... так что просто создайте массив заново.

$scope.rowCollection = [].concat($scope.rowCollection);
person flob    schedule 26.09.2016