2015-06-15 5 views
9

У меня проблема при изменении углового ng-изменения при программном изменении модели.ngChange вызывается, когда модель изменена программно

$scope.sendMessage = function() { 
    $scope.message = "Message sent"; 
} 

$scope.confirmed = true; 
$scope.mySelectBox = $scope.selects[1]; 

<select ng-model="mySelectBox" 
     ng-options="item.name for item in selects track by item.name" 
     ng-change="sendMessage()"> 
</select> 

Вот пример кода: http://plnkr.co/edit/R4MO86ihMrauHXhpCMxi?p=preview

Сообщение должно быть пустым, потому что sendMessage не следует. Модель изменяется программно.

+2

Хм, это может быть что-то странное в том, что 'ng-select' является intializing. «Ng-change» работает так, как ожидалось, и не запускается, когда значение раскрывающегося списка изменяется программно после иналинизации. Я сделал [скрипку] (http://jsfiddle.net/twn347d3/) на основе вашей демонстрации. – ryanyuyu

+0

Да, очень странно. Вероятно, может быть сообщено как проблема? –

+0

Здравствуйте, я сталкиваюсь с такой же проблемой в другом контексте при программном изменении модели со значениями, собранными по HTTP-запросу (см. Ссылку ниже). Вы нашли решение или объявили ошибку команде Angular JS в GitHub? ТИА. [См. Здесь] (http://stackoverflow.com/questions/31464323/setting-scope-mymodel-element-with-ng-change-enters-in-infinite-loop). –

ответ

3

Согласно документации, вы правы.

https://docs.angularjs.org/api/ng/directive/ngChange

, но это, кажется, ошибка вызвана порядком, в котором события зацепили

Лучший способ вокруг него - с прибегая к Js обработчиком (OnChange)

$scope.$watch("mySelectBox", function(a,b) { 
    if (a.name!=b.name) { 
     $scope.message = "Message sent! (old="+b.name+', new='+a.name+')'; 
    } 
    }); 

См шлепнуть http://plnkr.co/edit/2ZbxS1tszppR9SrNqxVB?p=preview

HTH

+0

$ touched хорошо работает (@tomek) – sambomartin

+2

Если удаляется «track by», он работает так, как ожидалось. Итак, как вы сказали, ошибка ... – user1821052

+0

Полезно знать, спасибо – sambomartin

0

Вы обеспечиваете значение модели контроллера, поэтому всякий раз, когда вы установите значение модели, которая соответствия со списком он будет вызывать нг-изменение:

Смотрите обновленный plunker: http://plnkr.co/edit/f3xGmKesLFbzti56WLyH?p=preview

+2

Это не ответ на этот вопрос. – kTT

3

нг -change обратный вызов изменяется при каждой смене модели, и он рассматривает первоначальную настройку как такое изменение. Что вы можете захотеть сделать, это запустить желаемый код только после того, как пользователь взаимодействует с ним. Вы можете проверить $ прикоснулся свойство поля:

<form name="exampleForm" ng-controller="ExampleController"> 
    <select ng-model="mySelectBox" name="mySelectBox" 
      ng-options="item.name for item in selects track by item.name" 
      ng-change="sendMessage()"> 
    </select> 
    <p>message = {{message}}</p> 
</form> 


$scope.sendMessage = function() { 
    if ($scope.exampleForm.mySelectBox.$touched) { 
     $scope.message = "Message sent"; 
    } 
} 
12

Вы можете попробовать ngModelOptions. См. Этот плункер для справки http://plnkr.co/edit/BdKx62RW5Ls2Iz1H3VR1?p=preview.

В моем примере я использовал ng-model-options="{ updateOn: 'change', debounce: { change: 0 } }" и, похоже, сработал. Он только запускает функцию, предусмотренную в ngChange, когда я меняю выбор. На этапе инициализации message остается пустым.

+1

Это может быть отмечено как правильный ответ, потому что вы не обязаны изменять функцию, вызываемую ng-change. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^