ng-change 不适用于异步控制器逻辑

ng-change not working with asynchronous controller logic

所以我有一个带有几个异步 .then 函数的控制器。最后,我用 $q.all() 函数捕获了它们,以继续我的同步工作。现在我有一个带有动态选项的 select:

 <select ng-model="data.selectedUser" ng-change="changeList()" ng-options="user as user.firstname + ' ' + user.lastname for user in users">
    <option value="">Select a user...</option>
  </select>

我想通过 ng-change 在我的控制器中获取 selected 用户,所以我调用了 changeList()。在 changeList 函数中,我做了一些不会触发的简单警报。当我首先在控制器中执行测试警报时,它甚至会在选择一个选项时冻结。

在我的 $q.all() 函数中:

    $q.all(promises).then(function () {
          users = UserService.getUsers();
          $scope.users = users;
          $scope.data.selectedUser = {};

          $scope.changeList = function () {
            var chosenUser = $scope.data.selectedUser;
            alert(chosenUser.firstname);
            alert('test');
          };

        }, function () {
          alert('Failed');
        });

警报什么都不做,我还尝试将 changeList 函数放在控制器底部的 $q.all 函数之外。我做错了什么?

编辑: 用户已经定义,所有这些都在工作。这纯粹是关于为什么 ng-change 不起作用。它还在没有先清空 selectedUser 范围的情况下进行了测试。

看起来 ng-change 在 select 上不起作用。你可以看看这个 js-fiddle: http://jsfiddle.net/fc984j9b/

我没有使用 ng-change 来触发事件,而是在 select 的 ng-model 上使用 $watch 来触发一个函数,在你的情况下它将是:

$scope.$watch("data.selectedUser", function(){
     $scope.changeList();
});

希望帽子能帮到你

此致

奥利弗

这是一个使用您的代码并且确实有效的 JSFiddle:

http://jsfiddle.net/A_Sambres/2kwhw0dw/1/

必须与您的代码不同的是用户对象

  users = [{"firstname":"Adrien","lastname":"Foo"}, ...{"firstname":"Thing2","lastname":"Foo"}];

,以及数据对象的初始化。

 $scope.data = {selectedUser : {}};

所以我想您可以检查此代码与您的代码之间的差异,以找出问题所在。 可能是用户对象的结构不正确,或者 $scope.data 在控制器中没有正确声明。