2015-07-18 3 views
6

Я хочу, чтобы иметь возможность обновлять область в Угловом от функции вне углового.Обновление области снаружи AngularJs без использования «angular.element.scope»

Например, если у меня есть плагин jQuery, который возвращает успешный обратный вызов, я хотел бы иметь возможность обновлять область действия от этого обратного вызова. Каждое решение, которое я видел для этого, включает вызов angular.element(selector).scope, а затем вызов $apply в области, возвращаемой. Тем не менее, я также видел много комментариев, указывающих, что это не работает, когда отладочная информация отключена, и поэтому она не рекомендуется, но я не видел альтернативных решений.

Кто-нибудь знает, как обновить область из-за угла Углового без использования angular.element(selector).scope?

Здесь принято решение в должности:.

«Вы должны использовать $scope.$apply(), если вы хотите внести какие-либо изменения в значение области из-за пределов контроля AngularJs как в/JavaScript обработчик события JQuery

function change() { 
    alert("a"); 
    var scope = angular.element($("#outer")).scope(); 
    scope.$apply(function(){ 
     scope.msg = 'Superhero'; 
    }); 
} 

Вот предупреждение, что .scope() не работает при отладке данных выключены в посте:

«FYI согласно документации с использованием .scope() требует отладки данных будет включить d, но использование данных Debug в производстве не рекомендуется по соображениям скорости. Решения ниже, кажется, вращаются вокруг сферы() - rtpHarry 5 декабря '14 в 15:12 "

Я не вижу никакого альтернативного решения для использования .scope() в этом посте или в других аналогичных должностях

.

AngularJS access scope from outside js function

Спасибо!

Update Одним из возможных решений не используя angular.element(selector).scope я был назначен объем в контроллере, который я использовал FirstCtrl на объект окна. Я впрыскивается $window в контроллер FirstCtrl и сделал следующее:

$window.FirstCtrlScope = $scope; 

Тогда из JQuery или другой JavaScript я мог бы сделать:

var scope=window.FirstCtrlScope; 
scope.$apply(function() { 
     // update the scope 
}); 

Является ли это хорошее решение, или есть более эффективные решения для обновления сферы без использования angular.element(selector).scope?

Спасибо!

ответ

1

Я думаю, что оба пути являются плохими. Конструкция, которая устанавливает контроллеры как глобальные переменные или доступ к области видимости по элементу html, приводит к тому, что приложение не поддающееся управлению со многими скрытыми ссылками.

Если вам нужно сотрудничество с плагинами jQuery (или другим неагрессивным кодом), включите его в директиву с прозрачным API (атрибуты, привязки и обратные вызовы).

1

Вы можете назначить область атрибуту данных для элемента, а затем получить доступ к этому. Посмотрите here, где библиотека углового ui-bootstrap реализовала этот подход.

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