仅在第二次尝试后,UI才会立即更新

时间:2018-02-20 23:47:16

标签: javascript angularjs angular-promise

这是.as-console-wrapper { max-height: 100% !important; top: 0; }

html

这是<div ng-repeat="user in controller.users"> <p>{{user.name}}</p> <button ng-click="controller.deleteUser(user)" value="delete"></button> </div>

controller

这是vm = this; vm.users; activate(); function activate() { service.getUserList().then(function(userList){ vm.users = userList; }); } function deleteUser() { service.deleteUser(user).then(function(){ activate(); }); }

service

因此,我删除了一个用户,然后与function deleteUser(user) { var index = userList.indexOf(user); if (index !== -1) userList.splice(index, 1); return new Promise((resolve, reject) => { resolve(userList); }); } 对话,完成后,激活service。这会更新activate(),但不会更新为UI。在第二次点击vm.users时,它可以正常工作!

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

问题:你的问题是AngularJs不知道在非角度承诺完成.then()后触发摘要周期。它只知道在从父函数返回时触发它(这是立即的,所以还没有发生变化)。

旁注 - 这就是为什么它适用于第二次点击,因为它会在从函数立即返回时触发,此时数据已从第一次点击更改。

解决方案:如果您将$q服务用于angularjs中的延迟/承诺,那么这将解决您的问题。该API几乎与Promise的API相同,因此您不必更改任何代码。只需将new Promise(...)更改为$q(...)

即可