2015-09-17 7 views
0

Я использую отчеты о яшме на моем веб-сайте, основанном на углах. В visualized.js отчета Jasper есть jQuery. Когда я загрузить отчет я обновить значение в моей компетенцииУгловая область, не обновляющаяся после вызова JQuery

$scope.reportLoaded = true

, но не обновляется на странице

{{reportLoaded}} //false 

Я думаю, что, вероятно, это конфликт между угловой и JQuery. Единственный способ решить эту проблему - использовать $ scope. $$ apply(), который я прочитал, что мы не должны его использовать. Как я могу решить эту проблему без использования приложения? Безопасно ли использовать его, если нет другого способа решить проблему?

+0

'{{reportLoaded = false}}' Разве это не всегда устанавливало значение reportLoaded в false? – ODelibalta

+0

спасибо за предложение. Я отредактировал свой вопрос – user3009752

ответ

0

Любой обновление в объеме, которое не выполняется угловым, не является заметным для углового. поэтому при обновлении любого значения в текущем $scope вы должны использовать $scope.$apply();.

Угловой - это двухсторонний механизм привязки данных, поэтому при изменении модели обновляется вид и наоборот. Внутренне угловой пробегает цикл $digest, который выполняет все проверки в текущем $scope. Пока вы делаете обновление в переменных $scope в угловых вещах, как обычно, но вне его, если вы меняете значения с помощью встроенного javascript или других библиотек, таких как jQuery, тогда цикл $digest должен быть запущен, вот где $scope.$apply() подходит.


$scope.$digest() также очень полезно и довольно быстрее, чем $scope.$apply(), потому что она $scope.$digest() работает в текущей области, но $scope.$apply() работает на $rootscope и внутренне пожаров $rootscope.$digest().

$scope.$digest() Чтобы использовать это в первую очередь, вам нужно настроить наблюдателя за областью видимости и то, что он на самом деле делает, он постоянно наблюдает за изменениями области и любыми средствами, если они находятся из угловых или из других источников, таких как ваши, в этом случае является прекрасным примером для настройки наблюдателя области, если вы хотите использовать его с $scope.$digest().

$scope.$watch('reportLoaded', function(newValue, oldValue, scope) { 
    scope.reportLoaded = newValue !== oldValue ? newValue : oldValue; 
}); 
+0

Я согласен, но все предлагают не использовать его. Я также прочитал его в antippatterns.So я должен использовать решение, которое не предлагается? – user3009752

+0

@ user3009752 его правда, вы можете использовать сервис '$ timeout' для запуска цикла дайджеста. – Jai

+1

@Jai Анти-шаблон здесь использует jQuery ajax call. $ timeout выполнит некоторые действия, а затем вызовет $ scope. $ apply(). –

0

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

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

так, используйте $ применять