Простое изменение ng не работает должным образом в angularjs

Мне может не хватать чего-то глупого, поскольку этот простой код работает не так, как ожидалось. Что не так, функция $scope.change в MainCtrl не работает (окно предупреждения не появилось).

Вкратце, вид (это в нефрите, лучше просмотреть?)

<body ng-app="epfApp">
...
label(ng-repeat="question in questions")
    | {{ question.title }}
    input(type="{{question.type}}", ng-change="change()")

и в файле контроллера

angular.module('epfApp')
.controller('MainCtrl', function ($scope, $window) {

    $scope.questions = {
        '1': {
                'title': 'The first question is?',
                'type': 'text',
                'placeholder': 'first question'
            },

        '2': {
                'title': 'The second question is?',
                'type': 'text',
                'placeholder': 'second question'
            }
    };

    $scope.change = function() {
        $window.alert('text');
    };

});

И маршрут:

$routeProvider
  .when('/', {
    templateUrl: 'views/main.html',
    controller: 'MainCtrl'
  });

Теперь то, что он делает правильно, состоит в том, что он правильно заполняет представление с помощью созданных данных (т.е. вопросов json). Однако, что он не делает правильно, функция change(), связанная с текстовым полем ввода, не работает.

Что мне здесь не хватает? Это, очевидно, очень простая работа.

Ответ 1

ng-change требует ng-model.

<div ng-controller="MainCtrl">
    <label ng-repeat="question in questions">
        {{question.title}}
        <input type="{{question.type}}" ng-model="question.placeholder" ng-change="change()" />
        <br />
    </label>
</div>

Проверьте этот JSFiddle.

Ответ 2

ng-change не работает, но работает, если вы определяете ng-model = "yourValue"... как это

<select id="editSelect" ng-model="Option" ng-change="okChange()" name="Option">
    <option ng-repeat="data in Option" value="{{data.Option}}">{{data.Option}}</option>
</select>

Ответ 3

<div ng-app ng-controller="myCtrl">
<input type="file" ng-model="image" onchange="angular.element(this).scope().uploadImage()" />
<ul>
   <li ng-repeat="item in uploadcollection">
     {{item.name}}  ({{item.size}})
   </li>
</ul>

function myCtrl($scope) {
    $scope.uploadImage = function () {
        $scope.uploadcollection.push({name: "Income.pdf", size: "10mb"});
        $scope.$apply();
}
$scope.uploadcollection = [{name: "Income.pdf", size: "10mb"}, {name: "Expense.pdf", size: "1.5mb"}];
}

Здесь я создал демо: http://jsfiddle.net/fA968/120/

ПРИМЕЧАНИЕ: Этот пример не работал с v1.4.8: https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js


Обновление Вот простой способ сделать это:

var myApp = angular.module('myApp', []);
myApp.directive('customOnChange', function() {
return {
 restrict: 'A',
 link: function(scope, element, attrs) {
   var onChangeFunc = scope.$eval(attrs.customOnChange);
      element.unbind('change').bind('change', function(e) {
        onChangeFunc(e);
      });
   }
  };
});

Здесь - обновленный Fiddle