2016-10-26 2 views
3

У меня есть контроллер без $scope

angular.module('todoApp', []) 
    .controller('TodoListController', function() { 
     var todoList = this; 

     todoList.title = "Default title"; 

     setTimeout(function() { 
      todoList.title = "Another title will appear after 5 seconds"; 
     }, 5000); 

     // ...some magic here 
    }); 

И взгляд:

<h1>Current title: {{TodoListController.title}}</h1> 

Этот код не будет корректно работает, becaufe функции в setTimeout не будет работать $digest(), который может обновить мой TodoListController.title.

Я знаю, что могу использовать $scope и использовать $scope.$digest(). Но - можно ли без него запустить $digest()? У меня всегда есть доступ к объекту angular. Может быть, через этот объект?

+0

не является ответом, так как другие ответы верны, но только потому, что вы используете ControllerAs, это не значит, что вы «без' $ scope' »... ControllerAs * abstracts *' $ scope', делая контроллер псевдонимом объект на '$ scope', уменьшая (но не полностью устраняя) ваши возможные потребности напрямую взаимодействовать с' $ scope'. Вы не должны смотреть на инъекцию '$ scope' * при необходимости * как плохой дизайн. – Claies

+0

Вопрос, вызванный ошибкой '$ scope is bad', является ложным. Преследование $ scope - самая смешная вещь, которая может случиться с Angular community. Btw, $ scope. $ Apply можно заменить на $ rootScope. $ Apply и $ rootScope. $ Digest. И кстати, есть веские причины, почему это не должно быть сделано, и нет веских причин, почему это должно быть. – estus

ответ

0

Вы должны использовать угловую версию таймаута: $ timeout.

https://docs.angularjs.org/api/ng/service/ $ таймаут

Эта услуга триггер угловую $ переваривать процесс.

2

Вы должны использовать $timeout вместо vanilla setTimeout.

angular.module('todoApp', []) 
.controller('TodoListController', function($timeout) { 
    var todoList = this; 

    todoList.title = "Default title"; 

    $timeout(function() { 
     todoList.title = "Another title will appear after 5 seconds"; 
    }, 5000); 

    // ...some magic here 
}); 

Использование $timeout от углового будет обрабатывать начиная переваривать цикл.

Угловые $ timeout также полезны, если вы хотите уведомить угловые, чтобы делать обновления без задержки. В этом случае вы можете вызвать его без второго параметра.

$timeout(function(){ 
    //something outside angular ... 
}); 

Функция передается $timeout будет вызван на следующий цикл переваривания. Этот способ лучше, чем вызов $ digest вручную, потому что он предотвратит ошибки digest already in progress.

+1

Ох ... Тайм-аут был всего лишь примером. Это может быть что-то другое, что не вызывает угловой '$ digest()'. –

+0

Обновлен мой ответ. –

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