Javascript AngularJS承诺在下次用户交互之前不会更新GUI
我正在AngularJS中使用Angular2样式的组件。在我的组件中,我有一个通过更改下拉菜单选项来更新GUI的功能:Javascript AngularJS承诺在下次用户交互之前不会更新GUI,javascript,angularjs,Javascript,Angularjs,我正在AngularJS中使用Angular2样式的组件。在我的组件中,我有一个通过更改下拉菜单选项来更新GUI的功能: var ctrl = this; async function updateOptions(node) { var name = node.name; let result = await MyService.getResult(name); ctrl.options = result;
var ctrl = this;
async function updateOptions(node) {
var name = node.name;
let result = await MyService.getResult(name);
ctrl.options = result;
console.log(ctrl.options);
}
显示这些选项的对应HTML为:
<select ng-if="$ctrl.getType() === 'dropdown'"
class="form-control selectList"
ng-model="$ctrl.value"
ng-options="option.key as option.displayName for option in $ctrl.options">
</select>
我的工厂代码:
myFactory.getStuff = function(name) {
return $http.get('/url/here/' + name)).then(
function(response) {
return response.data;
}
);
};
wait
用于浏览器支持的本机承诺。您还可以对本机承诺使用。然后使用语法
但AngularJS使用自己的承诺,这些承诺来自$q
服务。因此,您需要使用。然后使用语法,因为浏览器不知道这些承诺
当您使用$q
服务的承诺时(例如,当您使用$http
时),您不必担心摘要周期,因为当承诺兑现时,会为您运行摘要。但是如果你在AngularJS中使用本机承诺,你通常必须手动运行摘要循环。AngularJS使用$q
服务的承诺,该服务将为你运行摘要。如果您使用的是本机承诺,我认为您需要手动运行摘要。@FrankModica发布getResult
方法的代码会有帮助吗?不幸的是,我不熟悉$q服务,但我现在要读一读。在AngularJS中,人们通常使用内置的$http
服务获得API结果,我相信这会返回从$q
服务创建的承诺。因此,当接收到AJAX响应时,会自动为您运行摘要周期。如何实现getResult
?它是否返回了本机承诺?使用。然后语法而不是wait
似乎起到了作用。但为了完整起见,我仍然包含了上面要求的详细信息。也许你可以在下面发布一个简短的回答,解释为什么这样做有效。非常感谢你的帮助。老实说,我很惊讶它以前居然能工作一次await
应该适用于本机承诺,但不适用于$q
中的承诺!术语“摘要”未出现在$q
的AngularJS文档中。也许你可以提供一个链接到一个好的资源,解释角度“摘要”的方式/时间。摘要周期是AngularJS中的一个基本概念(框架是如何完成更改检测的)。AngularJS已经离开太久了,谷歌搜索会为你提供大量高质量的解释。一旦你理解了摘要周期,你真的只需要知道,$q
在你使用它的承诺时会触发摘要周期。我不确定在AngularJS中使用Angular2样式的组件时是否有办法手动运行摘要周期<例如,代码>$apply
和$digest
不可用。我可以通过将更新代码放入this.$doChange
函数中来正确更新某些内容,其中this
是控制器。您尝试在哪个对象上调用$digest
?您可能需要注入$scope
myFactory.getStuff = function(name) {
return $http.get('/url/here/' + name)).then(
function(response) {
return response.data;
}
);
};