$ наблюдаем () - это метод объекта Атрибуты , и поэтому его можно использовать только для наблюдения / наблюдения за изменением значения атрибут DOM. Он используется / вызывается только внутри директив. Используйте $ наблюдаем, когда вам нужно наблюдать / смотреть атрибут DOM, который содержит интерполяцию (т. Е. {{}}).
Например, attr1="Name: {{name}}"
, затем в директиве: attrs.$observe('attr1', ...)
.
(Если вы попытаетесь scope.$watch(attrs.attr1, ...)
, это не сработает из-за {{}} s - вы получите undefined
.) Используйте $ watch для всего остального.
$ watch () сложнее. Он может наблюдать / наблюдать «выражение», где выражение может быть либо функцией, либо строкой. Если выражение является строкой, оно превращается в функцию $ parse 'd (т.е. оценивается как угловое выражение ) в функцию. (Именно эта функция вызывается каждый цикл дайджеста.) Строковое выражение не может содержать {{}}. $ watch - это метод объекта Scope , поэтому его можно использовать / вызывать везде, где у вас есть доступ к объекту области видимости, поэтому в
, поскольку строки оцениваемый как угловое выражение, $ watch часто используется, когда вы хотите наблюдать / наблюдать свойство model / scope. Например, attr1="myModel.some_prop"
, затем в функции контроллера или связи: scope.$watch('myModel.some_prop', ...)
или scope.$watch(attrs.attr1, ...)
(или scope.$watch(attrs['attr1'], ...)
).
(Если вы попытаетесь attrs.$observe('attr1')
, вы получите строку myModel.some_prop
, что, вероятно, не то, что вы хотите.)
Как обсуждалось в комментариях к ответу @ PrimosK, все $ наблюдают и $ watches проверяются каждый цикл дайджеста .
Директивы с изолированными областями более сложны. Если используется синтаксис '@', вы можете $ наблюдаем или $ watch атрибут DOM, который содержит интерполяцию (то есть {{}}). (Причина, по которой он работает с $ watch, заключается в том, что синтаксис '@' выполняет для нас интерполяцию , поэтому $ watch видит строку без {{}}.) Чтобы упростить запоминание того, какой используйте, когда, я предлагаю использовать $ наблюдаем также для этого случая.
Чтобы помочь проверить все это, я написал Plunker , который определяет две директивы. Один (d1
) не создает новую область, другой (d2
) создает изолированную область. Каждая директива имеет одинаковые шесть атрибутов. Каждый атрибут - и $ наблюдаем, и $ наблюдаем.
Посмотрите журнал консоли, чтобы увидеть различия между $ наблюдаем и $ наблюдаем в функции связывания. Затем нажмите на ссылку и посмотрите, какие $ наблюдатели и $ watches запускаются изменениями свойств, сделанными обработчиком кликов.
Обратите внимание, что при запуске функции ссылки все атрибуты, содержащие {{}}, еще не оцениваются (поэтому, если вы попытаетесь проверить атрибуты, вы получите undefined
). Единственный способ увидеть интерполированные значения - это использовать $ наблюдаю (или $ наблюдаем, если используем изолированную область с '@'). Следовательно, получение значений этих атрибутов является асинхронной операцией . (И именно поэтому нам нужны функции $ наблюдений и $ наблюдений.)
Иногда вам не нужны $ наблюдать или $ смотреть. Например, если ваш атрибут содержит число или логическое значение (не строку), просто оцените его один раз: attr1="22"
, а затем, скажем, в вашей функции связывания: var count = scope.$eval(attrs.attr1)
. Если это просто константная строка & ndash; attr1="my string"
& ndash; затем просто используйте attrs.attr1
в вашей директиве (нет необходимости в $ eval ()).
См. Также пост группы Google Войты о выражениях $ watch.
Поскольку запись Exec
не выполняется оболочкой, вы не можете использовать ~/
.
Заменить
Exec=~/Programs/eclipse_c/eclipse_c
на
Exec=/home/dan/Programs/eclipse_c/eclipse_c