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()可以帮助我们找到一个更合适的答案,回答我自己的问题:你有解决方案吗?答案怎么错了?我仍然在寻找一个答案,而不是“它只是坏了”,如果你有一个。