1

Я пытаюсь изменить некоторые $ переменные корневого индекса изнутри контроллера после того, как я получил promise из службы.angularjs сменил корневой знак после обещания в контроллере

В $ переменных rootscope используются для установки HTML-страница названия атрибута и т.д.

Ниже приведен код, у меня есть, я создал функцию, называемую 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 
}]); 

Как я могу изменить переменные $ rootcope после того, как получил отсроченное обещание от службы?

+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 вы можете передать ту же функцию, то в качестве 2-го аргумента

Одно из тонких различий между .catch и с помощью 2-й аргумент метода .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

 Смежные вопросы

  • Нет связанных вопросов^_^