【问题标题】:ng-change not working with asynchronous controller logicng-change 不适用于异步控制器逻辑
【发布时间】:2016-09-23 02:12:04
【问题描述】:

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

 <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 我想在我的控制器中获取选定的用户,所以我调用了 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 范围的情况下进行测试。

【问题讨论】:

  • 首先,您正在重置 $scope.data.selectedUser = {};到一个空对象,第二(我不知道这是不是故意的)你没有在用户上使用 var 关键字( user = UserService ....,而不是 var user = Userservice ....
  • 抱歉忘了说用户已经定义了所有这些都已经在工作了。它纯粹是关于 changeList 问题。此外,范围重置是因为如果我不先将其定义为空,通常它将无法工作。但也经过测试,但问题仍然存在
  • 是的,但您必须在函数之外定义 $scope.data.selectedUser。而且我不明白为什么 $scope.changeList 在你的 q.all 结果块中
  • 当我这样做时,例如在控制器开始时,我的选择列表不知何故为空
  • 它在 $q 方法中,因为我在它的外部和内部都试过了。

标签: angularjs select ionic-framework controller angularjs-ng-change


【解决方案1】:

它看起来不像 ng-change 对选择起作用。你可以看看这个 js-fiddle:http://jsfiddle.net/fc984j9b/

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

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

希望帽子有帮助

最好的问候

奥利弗

【讨论】:

  • 我试过了,不知何故它只在视图加载后触发,但是当我更改选项时它不再触发,那么我的代码肯定有其他问题。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 谢谢阿德里安,会去看看!
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2015-03-09
  • 1970-01-01
  • 2023-03-21
  • 2017-01-18
相关资源
最近更新 更多