0

关于 SO 的以下问题有几个类似的问题。我找到的答案要么过时,要么错误,要么不能解决我的问题。

以下片段被精简为这个问题似乎必不可少的内容。

看法:

<div ng-app="main">
    <!-- some stuff -->
    <ng-include src="getPartial(case.status)"></ng-include>
</div>

包含部分的相关部分:

<div class="controls">
    <label class="checkbox" for="iterationDiarySurvey">
        <a ng-show="surveyDiaryMailSent == 0" ng-click="sendMail('diaryLinks')">
            Send Mail
        </a>
        <span ng-show="surveyDiaryMailSent == 1" class="badge">Mail sent</span>
    </label>
</div>

sendMail()点击时调用的函数:

$scope.sendMail = function(type) {
    <!-- snip -->
    } else if (type == 'diaryLinks') {
        Mail.create({some data}).then(function() {
            $scope.surveyDiaryMailSent = 1;
        });
    }
};

成功实现承诺时的预期行为$scope.surveyDiaryMailSent是,由于设置为 1,因此<a>元素消失而<span>元素显示。

虽然这不会发生。仅在手动刷新浏览器后。

我在其他地方做同样的(非常相似)的事情,它总是工作得很好。在这种特殊情况下,我只是无法更新视图。


什么没有帮助:

  • 将分配或服务调用包装在$apply. 导致通常的错误表明“正在消化”。
  • $apply在分配后添加,同样的原因
4

1 回答 1

1

您还没有显示Mail该类的代码,因此我无法确定返回的承诺Mail.send()是否是 Angular 承诺。但是,您可以将调用包装起来$q.when()以帮助确保 Angular 知道何时解决了承诺:

function MyController($scope, Mail, $q) {
    /* ... */
    $scope.sendMail = function(type) {
        /* ... */
        $q.when(Mail.create({some data})).then(function(result) {
            // result will be the resolved value
            $scope.surveyDiaryMailSent = 1;
        });
    }
}
于 2013-08-08T22:31:11.523 回答