2016-01-13 2 views
0

Я работаю с angularjs, и мой веб-сайт получает данные из websocket каждую секунду, и теперь я использую $scope.$apply для обновления каждый раз, когда я получаю факт, проблема в том, когда мой сервер отправляет больше информации, чем обычно веб-страница очень медленная, и если я прокомментирую $scope.$apply, то работа в сети будет прекрасной.Angularjs refresh only angular.element

У меня есть что-то вроде этого

$scope.ChangeData=function(str){ 
    //process.... take around 1ms 
    //here i change a variable, with new info 

    $scope.$apply(); 
//here the process print 60-100ms 
} 

, то я хочу, чтобы это сделать,

$scope.ChangeData=function(str){ 
      //process.... take around 1ms 
      //here i change a variable, with new info 
angular.element(document.getElementById(str.ID)).scope().$apply 

     //I do this, I hope the process will only take a few ms 
     //beacuse i change only the changed element 
     } 

, но у меня есть ошибки в этой части

Не удается прочитать свойство «$ применять 'не определено

пожалуйста, помогите мне ..

UPDATE Example in plnkr

+0

Вы вводите '$ scope' в свою функцию контроллера? Кроме того, зачем вам нужно называть '$ apply'? Если вы выполняете это в рамках логики обещания или какой-либо другой угловой конструкции, вам не нужно будет называть '$ apply'. И в качестве примечания, ** ** не рекомендуется использовать логику типа 'angular.element (elem) .scope()' где угодно, кроме как внутри директивы.Рассмотрите возможность использования службы, если эти данные должны потребляться другим контроллером или использовать аргумент 'elem', указанный в вашей функции' link', в директиве – jusopi

+0

, если я не использую '$ apply', информация не обновляется, пока вы не нажмете на элемент, – jearca

+0

ChangeData, как сказано в названии, изменяет данные, но эта информация не отображается, пока вы не сделаете '$ apply' или' click' – jearca

ответ

-1

Без полного понимания контекста приложения, я могу только предположить, что это приложение типа сообщений. Это предположение основано на том факте, что: а) вы используете сервер сокетов для push-обновления существующих данных в пользовательском интерфейсе и b) вы пытаетесь поддерживать существующий уже существующий пользовательский интерфейс.

Я взял ваш plunkr и разветвил его, как бы я подошел к этой проблеме. Есть 2 вещи, чтобы понять:

  • ItemsController является упрощенной вниз так, что он только потребляет модель исходит от службы и моделируемого толчка для обновления к указанной модели
  • itemsService облегчает
    • запоминанию данные сообщения
    • обрабатывает нажимной обновление

Поскольку ng-repeat уже оплачено , просмотрев, любые изменения в его целевой коллекции, вам не нужно делать какие-либо из вещей, которые вы делали, в том числе . Каждый элемент в ng-repeat обновит DOM для вас. Это его цель.

https://plnkr.co/edit/qLeDuP0iaTUE16rY2KTl?p=preview

+0

ng-repeat should быть обновленным, но это не произойдет ... если я отключу '$ scope. $ apply', просмотр не будет обновляться до тех пор, пока я не сделаю щелчок – jearca

+0

Угловое наблюдает за сборкой, но не постоянно перебирает ее, чтобы обнаружить, изменилось. Это происходит только тогда, когда вызывается $ scope. $ Apply(). Обычно это происходит автоматически, потому что угловой делает это после ng-click или возникает ответ HTTP. Но если вы не используете какое-либо угловое обслуживание, как это делает OP, $ scope. $ Apply() необходимо. В противном случае вы изменяете область действия, не зная об этом. –

+0

@jusopi simple plunkr, демонстрирующий это: http://plnkr.co/edit/53Uf98rVObdNAtCRqZCH?p=preview –

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