Угловая нг-смена не вызывающего кода. Я использую неправильную модель

Я создаю приложение, используя генераторы MEAN.js и учебник, который я нашел в Интернете. Здесь у меня есть средство выбора даты в одном из моих угловых представлений. Сейчас я бы хотел, чтобы директива ng-change была распознана и что-то сделала. В тот момент, когда я изменяю дату, мое тестовое предупреждение, показанное здесь, не вызывается.

<div class="form-group">
   <label class="control-label" for="statusdate">Status Date</label>
   <div class="controls">
      <input type="date"  ng-change="alert('something')" data-ng-model="statusDate" id="statusdate" class="form-control">
   </div>
</div>

Может кто-нибудь помочь? Я новичок в Angular.

Кроме того, я где-то читал, что это может быть потому, что я использовал data-ng-модель, а не ng-модель. Может ли это быть так? Если так, то в чем разница между ними?

3 ответа

Решение

Вы выполняете метод, который не существует в контроллере.

Попробуйте создать это так:

$scope.alert = function(msg) {
    alert(msg);
 };

Ах, проблема в том, что у вас нет контекста, который, как вы думаете, у вас есть.

Почти везде в Javascript корень всех замыканий window, который содержит alert(),

Почти везде, но не везде. Не в том контексте, в котором это ng-change() оценивается. Вы можете исправить это, например, создав контроллер, который добавил значение alert к $scopeи указывая на window.alert,

<div class="form-group">
   <label class="control-label" for="statusdate">Status Date</label>
   <div class="controls" ng-controller="myController">
      <input type="date"  ng-change="alert('something')" data-ng-model="statusDate" id="statusdate" class="form-control">
   </div>
</div>

А затем в Javascript:

angular.module("MyApp")
.controller("myController", ['$scope', '$window', function($scope, $window) {
  $scope.alert = $window.alert;
}]);

Изменить: вы можете использовать только window вместо $window, так как window доступно здесь, но это сделает ваш код более сложным для тестирования в долгосрочной перспективе.

Проблема в том, что ng-change ожидает выражение, но вы даете ему имя функции alert() для отображения строки "что-то", и, следовательно, оно не знает, что делать.

Возможное решение этой проблемы - добавить это поверх вашего HTML-файла.

<script>
  angular.module('Your_App_Name', [])
    .controller('YourControllerName', ['$scope', '$window', function($scope, $window) {
      $scope.alert = function(message) {
          $window.alert(message);
      };
   }]);
</script>

Обратитесь к документации для получения дополнительной информации о том, как использовать ng-change https://docs.angularjs.org/api/ng/directive/ngChange

Обратитесь к разнице между ч / б ng-моделью и data-ng-моделью, чтобы понять разницу между data-ng-моделью и ng-моделью. Они оба должны работать нормально.

Другие вопросы по тегам