Каков самый простой способ передать переменную области видимости AngularJS из директивы в контроллер? Все примеры, которые я видел, кажутся такими сложными, разве я не могу получить доступ к контроллеру из директивы и установить одну из его переменных области?
angularjs
angularjs-directive
ng-controller
заводная игрушка
источник
источник
Ответы:
Отредактировано 2014/8/25: Вот где я его раздвоил .
Спасибо @anvarik.
Вот JSFiddle . Я забыл, где я это раздвоил. Но это хороший пример, показывающий разницу между = и @.
источник
Подождите, пока angular оценит переменную
Я много возился с этим, и не мог заставить его работать даже с переменной, определенной
"="
в области видимости. Вот три решения в зависимости от вашей ситуации.Решение # 1
Я обнаружил, что переменная еще не была оценена angular, когда она была передана в директиву. Это означает, что вы можете получить к нему доступ и использовать в шаблоне, но не внутри ссылки или функции контроллера приложения, если только мы не дождемся его оценки.
Если ваша переменная изменяется или извлекается из запроса, вы должны использовать
$observe
или$watch
:А вот и html (помните скобки!):
Обратите внимание, что вы не должны устанавливать переменную
"="
в области видимости, если вы используете$observe
функцию. Кроме того, я обнаружил, что он передает объекты как строки, поэтому, если вы передаете объекты, используйте решение №2 илиscope.$watch(attrs.yourDirective, fn)
(или №3, если ваша переменная не меняется).Решение # 2
Если ваша переменная создана, например, в другом контроллере , но вам просто нужно подождать, пока angular ее оценит, прежде чем отправлять ее в контроллер приложения, мы можем использовать
$timeout
для ожидания, пока$apply
не запустится. Также нам нужно использовать$emit
для отправки его в контроллер приложения родительской области (из-за изолированной области в директиве):А вот и HTML (без скобок!):
Решение # 3
Если ваша переменная не меняется и вам нужно оценить ее в своей директиве, вы можете использовать
$eval
функцию:А вот и html (помните скобки!):
Также посмотрите этот ответ: https://stackoverflow.com/a/12372494/1008519
Ссылка на проблему FOUC (вспышка нестилизованного содержимого): http://deansofer.com/posts/view/14/AngularJs-Tips-and-Tricks-UPDATED
Для заинтересованных: вот статья о жизненном цикле angular
источник
ng-if="someObject.someVariable"
директивы (или элемента с директивой в качестве атрибута) - директива вступает в силу только после того,someObject.someVariable
как определена.