Javascript 使用$q.all有时会导致selects无法正确读取模型
我注意到,我的一个选择下拉列表中偶尔会没有从角度模型中选择正确的项目。我把它追溯到了一个问题,即在表单上加载角载荷之前,承诺没有兑现。在尝试了大量不同的方法之后,我最终决定做这个毫无意义的事情来让它工作:Javascript 使用$q.all有时会导致selects无法正确读取模型,javascript,angularjs,angularjs-scope,angular-promise,Javascript,Angularjs,Angularjs Scope,Angular Promise,我注意到,我的一个选择下拉列表中偶尔会没有从角度模型中选择正确的项目。我把它追溯到了一个问题,即在表单上加载角载荷之前,承诺没有兑现。在尝试了大量不同的方法之后,我最终决定做这个毫无意义的事情来让它工作: $q.all([ $scope.categories.$promise, $scope.durations.$promise, $scope.job.$promise, $scope.jobStatuses.$promise, $scope.recrui
$q.all([
$scope.categories.$promise,
$scope.durations.$promise,
$scope.job.$promise,
$scope.jobStatuses.$promise,
$scope.recruiters.$promise,
$scope.states.$promise
]).then(function () {
window.setTimeout(function() {
$scope.editJob = {
acceptsVisas: $scope.job.acceptsVisas,
categoryId: $scope.job.categoryID,
city: $scope.job.city,
contact: $scope.job.contactID,
description: $scope.job.details,
duration: $scope.job.durationID,
internalId: $scope.job.internalReqID,
postal: $scope.job.postal,
recruiter: $scope.job.recruiterID,
state: $scope.job.stateID,
status: $scope.job.jobStatusID,
title: $scope.job.title
}
}, 10);
});
如果没有setTimeout,select有时不会选择错误的招聘人员。我已经在Angular/JS中调试了它。检查该模型表明,正确的字段是预先设置的,并且不可靠地重复,这导致我假设Angular在承诺完成之前加载表单,然后在加载招聘人员数据时没有选择正确的招聘人员。没有任何东西是在上下文之外设置的,这几乎是除了在资源上运行的查询之外的所有代码。我还更新了
windows.setTimeout
以使用$timeout
,但首先需要做的主要问题仍然存在。一年后,我没有找到答案。从那以后我做了这么多的搜索,似乎最简单的答案是,这是角度上的一个缺陷,对此我真的没什么可做的。超时解决方案有效,只是不需要它。不幸的是,这是第三方软件的副作用。使用$timeout而不是settimeout如果没有深入查看,这可能是您的$scope.editJob
在角度上下文之外设置的问题,即它是在承诺解析期间设置的。上面的注释说明了$timeout
。如果您将editJob
集合包装在$timeout
中,此黑客将使您的代码返回角度范围。@JamieDixon:$q
是角度服务。代码在内,则
在角度范围内。窗口中的代码。setTimeout
不太多。@JamieDixon-我原以为这就是问题所在,所以除此之外,我删除了对$scope.editJob
的任何调用。我可能会将其更改为$timeout,但我的抱怨是,我不应该执行超时,因为我会假设Angular会选择正确的模型值,并使select选择该值。触发上述代码的是什么?如果在指令中,您可能需要调用$apply
来触发摘要循环,即使所有内容都在“角度范围内”。mcve()可以帮助我们找到一个更合适的答案,回答我自己的问题:你有解决方案吗?答案怎么错了?我仍然在寻找一个答案,而不是“它只是坏了”,如果你有一个。