Angularjs: это неправильный способ написания?

<input ng-model="search" type="text">
<table ng-if="search.length > 2 || search.length == 0" 
       ng-init="somerows = getdata()">
   <tr ng-repeat="row in somerows | filter:search">...</tr>
</table>

иногда это приводит к более быстрому мышлению
но так ли это?

1 ответ

Решение

Я думаю ng-init выполняется только тогда, когда элемент скомпилирован, поэтому ваш getdata() будет вызываться только при появлении таблицы. Вот что происходит при вводе:

  1. пустой search: таблица отображается, getdata() называется
  2. Введите "а": таблица скрыта, getdata() НЕ называется
  3. Введите "b": таблица все еще скрыта, getdata() НЕ называется
  4. Тип "с": таблица отображается, getdata() называется
  5. Введите "d": таблица по-прежнему отображается так getdata() НЕ называется
  6. И так далее, ng-init не будет выполнен, пока таблица не будет снова скрыта и повторно отображена ng-if

Если у вас есть 10 символов и CTRL+X, чтобы их вырезать, ваш поисковый запрос будет пустым, но getdata() все еще не вызывается, потому что таблица все еще отображается, а ng-init не выполняется. Если вы вставите что-то в то getdata() до сих пор не вызывается, потому что таблица видна и ng-init уже был выполнен.

Я думаю, что было бы лучше посмотреть поисковый запрос и позвонить getdata() затем:

$scope.$watch('search', function(newValue) {
    if (typeof(newValue) === "string" && 
              (newValue.length == 0 || newValue.length > 2)) {
        $scope.getdata();
    }
}
Другие вопросы по тегам