2016-05-10 1 views
1

Я обертываю клиента веб-сервиса в угловое обслуживание. Данный клиент работает emmiting события для конкретных обновлений, как так:Обновление угловой области событий

app.service('AngularClient', function() { 
    this.info = null 
    this.login = function() { 
    client.login(loginInfo).then(function (loggedClient) { 
     loggedClient.on('newInfo', function (info) { 
     this.info = info 
     }) 
    }) 
    } 
}) 

Контроллер использует эту услугу, и связывает его с его $scope:

app.controller('Ctrl', function (AngularClient, $scope) { 
    $scope.client = AngularClient 
}) 

Однако, каждый раз, когда 'newInfo' событие увольняют угловой не автоматически запускает цикл digest, поэтому я не могу контролировать, когда обновляется info в пользовательском интерфейсе. Каков угловой способ убедиться, что это происходит каждый раз?

ответ

1

Если вы хотите продолжать получать обновления в случае входа в систему, вы могли бы сделать что-то вроде этого:

app.service('AngularClient', function() { 
    this.info = null 
    this.loginCallback = null 
    this.login = function() { 
    client.login(loginInfo).then(function (loggedClient) { 
     loggedClient.on('newInfo', function (info) { 
     this.info = info 
     if (this.loginCallback) this.loginCallback(info); 
     }) 
    }) 
    } 
}) 

app.controller('Ctrl', function (AngularClient, $scope) { 
    $scope.client = AngularClient 
    AngularClient.loginCallback = function(info, err){ // optional error 
    $scope.user.property = info.property; 
    $scope.$apply(); 
    } 
}) 
+0

'$ scope' не используется по его службы' AngularClient'. apply() следует использовать где-то в другом месте. – ThiagoPXP

+0

$ scope не используется его службой, он используется закрытием внутри контроллера. – tommybananas

+0

Может ли обещание быть разрешено несколько раз? Событие «newInfo» постоянно срабатывает, пока есть обновления в службе. –

0

Угловая не будет знать, что он должен усвоить еще раз, если на обычае методы асинхронных созданный код.

Способ передвижения - это использовать $scope.$apply(). Однако $ scope не распространяется на вашу услугу. Итак, на вашем угловом контроллере вы можете обернуть прослушанную функцию вашего события в $apply();

$scope.$apply(function() { 
    //your code here.  
}); 

http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

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