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