1

我试图从服务器收到promise之后,从控制器中更改一些$ rootcope变量angularjs在控制器中承诺后更改rootcope

的$ rootscope变量用来设置html页面的title属性等

下面是我的代码,我创建了一个名为changeRootPageNotFound()改变$ rootscope变量功能。如果在promise.then函数中调用它,它将不起作用。

app.controller('mainController', ['$routeParams', '$scope', '$rootScope', 'mainService', function ($routeParams, $scope, $rootScope, mainService) { 
    var mainCtrl = this; 
    mainCtrl.id = $routeParams.itemId; 

    var promise = mainService.getData($routeParams.id); 

    promise.then(function (response) 
    { 
     if (response.data.data) { 
      mainCtrl.data = response.data.data; 
     } else { 
      mainCtrl.data = false; 
      changeRootPageNotFound(); 
     } 
    }); 
    function changeRootPageNotFound() { 
     $rootScope.title = "Page Not Found - 404"; 
     $rootScope.titleSuffix = ""; 
    } 
    // changeRootPageNotFound(); // works here 
}]); 

如何在收到服务的延期承诺后更改$ rootscope变量?

+0

你试过运行$ rootScope。$ digest()后所有的根作用域变化? –

+0

@JohnMaclein,谢谢你刚刚尝试过,但它没有工作 – Holly

+0

考虑在这里,你正面临的任何错误信息。 –

回答

2

添加.catch方法:

promise.then(function (response) 
{ 
    //if (response.data.data) { 
     mainCtrl.data = response.data.data; 
    //} else { 
    // mainCtrl.data = false; 
    // changeRootPageNotFound(); 
    //} 
}).catch(function(errorResponse) { 
    console.log(errorResponse.status); 
    mainCtrl.data = false; 
    changeRootPageNotFound(); 
    throw errorResponse; 
}); 

$http服务拒绝承诺在状态为外范围200-299。


什么throw errorResponse;的,可以在被排除在外?

如果省略throw errorResponse,废品处理程序返回的undefined的值。这将转换为被拒绝承诺履行承诺,解决为undefined。如果没有进一步的链接,它可以被排除在外。

问题的一个常见原因是程序员不知道这一点,并无意中转换承诺。


代替.catch可以传递同样的功能,以然后作为第二参数

一个.catch和使用该.then方法的第二参数之间的细微差别是,运行时.then成功处理程序中的错误不会被捕获到第2个参​​数的拒绝处理程序中。

+0

谢谢你的工作。什么是'throw errorResponse;'因为它可以被排除吗?此外,这似乎是正确的方式来做到这一点,因为我不需要'if(response.data.data)'条件 – Holly

+0

@Holy而不是'catch',那么您可以将相同的函数传递给第二个参数 – Walfrat

1

根据你的代码,你的代码应该已经工作。在我的蹲伏者之后,他的工作也在推迟承诺之后。

// Code goes here 
angular.module('Test',[]) 
    .service('Service', function($q){ 
    this.ts = function(){ 
     var deferred = $q.defer(); 
     deferred.resolve("hello") 
     return deferred.promise; 
    } 
    }) 
    .controller('Controller', function(Service, $rootScope){ 

    Service.ts().then(function(response){ 
     $rootScope.title="hello"; 
     changeRootPageNotFound(); 
    }); 

    function changeRootPageNotFound() { 
     $rootScope.title = "Page Not Found - 404"; 
     $rootScope.titleSuffix = ""; 
    } 
    }); 

下面是HTML

<!DOCTYPE html> 
<html> 

    <head> 
    <script data-require="[email protected]" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="script.js"></script> 
    </head> 

    <body ng-app="Test"> 
    <div ng-controller="Controller"> 

     <h1>{{title}}</h1> 

    </div> 
    </body> 

</html> 

请检查该Plunker https://plnkr.co/edit/THXDYrWuTqR8UYSJlerB?p=preview