Я пытаюсь получить оцененный атрибут из моей пользовательской директивы, но не могу найти правильный способ сделать это.
Я создал этот jsFiddle для разработки.
<div ng-controller="MyCtrl">
<input my-directive value="123">
<input my-directive value="{{1+1}}">
</div>
myApp.directive('myDirective', function () {
return function (scope, element, attr) {
element.val("value = "+attr.value);
}
});
Что мне не хватает?
javascript
binding
angularjs
directive
Шломи Шварц
источник
источник
Ответы:
Обратите внимание: я обновляю этот ответ, так как нахожу лучшие решения. Я также сохраняю старые ответы для дальнейшего использования, пока они остаются связанными. Последний и лучший ответ приходит первым.
Лучший ответ:
Директивы в angularjs очень мощные, но требуется время, чтобы понять, какие процессы стоят за ними.
При создании директив angularjs позволяет вам создавать изолированную область с некоторыми привязками к родительской области. Эти привязки задаются с помощью атрибута прикрепить элемент в DOM и как определить области видимости свойства в объекте директивы определения .
Существует 3 типа параметров привязки, которые вы можете определить в области видимости, и вы записываете их в качестве префиксов связанных атрибутов.
HTML
В этом случае в области действия директивы (будь то связывание функции или контроллера) мы можем получить доступ к этим свойствам следующим образом:
"Все еще в порядке" Ответ:
Поскольку этот ответ принят, но у него есть некоторые проблемы, я собираюсь обновить его до лучшего. По-видимому,
$parse
это сервис, который не лежит в свойствах текущей области, что означает, что он принимает только угловые выражения и не может достичь области.{{
,}}
выражения компилируются при инициализации angularjs, что означает, что когда мы пытаемся получить к ним доступ в нашемpostlink
методе директив , они уже скомпилированы. ({{1+1}}
уже2
в директиве).Вот как вы хотели бы использовать:
,
Здесь вы должны заметить одну вещь: если вы хотите установить строку значения, вы должны заключить ее в кавычки. (См 3-й вход)
Вот скрипка для игры: http://jsfiddle.net/neuTA/6/
Старый ответ:
Я не убираю это для людей, которые могут быть введены в заблуждение, как я, обратите внимание, что использование
$eval
совершенно нормально, правильный способ сделать это, но$parse
имеет другое поведение, вам, вероятно, не понадобится это для использования в большинстве случаев.Способ сделать это, еще раз, используя
scope.$eval
. Он не только компилирует угловое выражение, но также имеет доступ к свойствам текущей области.То, что вам не хватает было
$eval
.источник
$scope.text
будет не определена функция связывания. То, как ответ в настоящее время сформулирован, звучит так, будто оно не будет неопределенным. Вы должны использовать $ наблюдаем () (или $ watch () также будет работать здесь), чтобы асинхронно видеть интерполированное значение. Смотрите мой ответ, а также stackoverflow.com/questions/14876112/…$parse
сервис вводится, а затем никогда не используется. Я что-то пропустил?Для значения атрибута, которое необходимо интерполировать в директиве, которая не использует изолированную область видимости, например,
использовать метод атрибутов
$observe
:Со страницы директивы ,
Если значение атрибута является просто константой, например,
Вы можете использовать $ eval, если значение является числом или логическим значением, и вам нужен правильный тип:
Если значение атрибута является строковой константой или вы хотите, чтобы значение было строковым типом в вашей директиве, вы можете получить к нему прямой доступ:
В вашем случае, однако, поскольку вы хотите поддерживать интерполированные значения и константы, используйте
$observe
.источник
Другие ответы здесь очень правильные и ценные. Но иногда вам просто нужно просто: получить простое старое проанализированное значение при создании экземпляра директивы, не требуя обновлений и не вмешиваясь в изолированную область видимости. Например, может быть удобно предоставить декларативную полезную нагрузку в вашу директиву в виде массива или хеш-объекта в виде:
В этом случае, вы можете сократить погоню и просто использовать хороший базовый
angular.$eval(attr.attrName)
.Рабочая скрипка .
источник
Для того же решения, которое я искал
Angularjs directive with ng-Model
.Вот код, который решает проблему.
HTML DOM
Мой результат:
источник
Используйте $ timeout, потому что директивный вызов после загрузки dom, так что ваши изменения не применяются
источник