1

在 Angular 1.6.2 和 UI 路由器中,我希望仅在服务器上建立用户具有访问页面的正确角色/权限后才显示页面的内容。

没有$scope.apply() catch()不会被解雇,但由于某种原因,当我把它放在那里时,情况并非如此。没有变量似乎不会更新视图$scope.apply()vm.showContent

我没有收到 Angular 或 JS 错误,所以我说我会省略任何其他相关代码,因为我认为没有其他问题会导致问题。

查看/HTML

<div ng-show="data.showContent">
 // my html, not to be shown until vm.showContent is true     
</div>

控制器

// more JS
var vm = this;
vm.showContent = false;
// more JS
vm.hasRole = function (role, toState, event) {

    Auth.hasRole(role).then(function (data) {
        vm.showContent = true;
        // without this nothing is happening with the view
        $scope.apply();
        alert('has role'); // firing successfully
    }).catch(function () {
        alert('does not have role') // firing also if I add $scope.apply();
        if (event != false) {
            event.preventDefault();
            $state.go('no-permission');
        }
    });
}
4

1 回答 1

2

查看错误响应值:

//}).catch(function () {
//LOG error response
}).catch(function(errorResponse) {
    console.warn(errorResponse);
    alert('does not have role') // firing also if I add $scope.apply();
    if (event != false) {
        event.preventDefault();
        $state.go('no-permission');
    }
});

可能会$scope.apply()抛出:

错误:$rootScope:inprog 操作已在进行中

当在 Promise 链中的成功处理程序中抛出错误时,$q 服务会跳到链中的第一个后续拒绝处理程序。

有关该错误的更多信息,请参阅AngularJS 错误参考 - $rootScope/inprog


AngularJS 1.6 将抛出的错误视为常规拒绝

在以前的版本中,成功和拒绝处理程序中抛出的错误将创建控制台错误消息。AngularJS 1.6 已更改为将抛出的错误与常规拒绝相同:

$q:

由于e13eea,从 Promise 的 onFulfilled 或 onRejection 处理程序抛出的错误被视为与常规拒绝完全相同。以前,它也会被传递给$exceptionHandler()(除了以错误为理由拒绝承诺)。

--AngularJS 开发者指南 - 从 v1.5 迁移到 v1.6 - $q

于 2017-02-27T14:23:57.913 回答