1

У меня есть директива по неизолированной области. Я не хочу изолировать его, потому что он должен быть на элементах с другими директивами. Тем не менее мне нужно наблюдать за предметами. Поэтому я пробовал это:

scope.$watch(function() { 
    return scope.$apply(attrs.myAttribute); 
}, function(val) { 
    return val ? doSomething():doSomethingElse(); 
}); 

Это не работает, потому что угловой выброс вызывает ошибку цикла дайджеста. Поэтому мой вопрос заключается в том, как я могу динамически наблюдать за объектом с помощью неизолированной директивы.

Спасибо,

ответ

1

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

Вместо этого вы можете просто сделать:

scope.$watch(attrs.myAttribute, function(val){ 
    return val ? doSomething() : doSomethingElse(); 
}; 

Выражение устанавливается на myAttribute будет получить оценку от объема элемента, на котором ваша директива сидит так, как вы сказали, это не изолирована. И когда значение возвращаемого значения изменится, функция обратного вызова будет вызвана.

Например, если ваш HTML выглядел что-то вроде этого

<div myNoNewScopeDirective myAttribute="doThis(value)"></div> 

doThis(value) будет получить оценку по отношению к области, связанной с элементом сНа и возвращаемым значением будет отслеживаться вашим myNoNewScopeDirective. В результате любое изменение такого значения вызовет обратный вызов, который вы предоставили, и когда val является правдивым, будет вызвано doSomething.

+0

Извините, но я не верю, что это сработает. Как вы можете называть 'scope. $ Watch (attrs', если в области нет ничего? Вы не можете просто смотреть атрибуты в этом стиле, а OP не хочет выделять область - поэтому определение области на уровне директивы не будет достаточным. Можете ли вы создать небольшую рабочую демонстрацию этого? [Вот JSFiddle] (https://jsfiddle.net/rqej2b4j/) того, как я интерпретирую этот ответ. Можете ли вы сделать этот функционал? – scniro

+0

@scniro В моем project директива находится внутри области действия контроллера. Поэтому мне нужна директива, чтобы посмотреть что-то, что уже было определено в области видимости, но сделать это динамически. Например, если контроллер имел scope.foo, определенный на нем, мне нужен был мой элемент . Так что всякий раз, когда я менял свою директиву, моя директива могла действовать соответственно. Я определенно получаю и ваш ответ, но я не хотел, чтобы атрибут был интерпретирован как строка. – user3828000

+0

, но 'myAttr =" foo "' не будет доступен для просмотра внутри директивы - это просто атрибут в этой точке и никак не связан. Как вы размещаете его по охвату? @ User3828000. 'scope. $ watch (attrs.myAttr, [...]' всегда будет давать 'undefined', \t , поэтому в приведенном выше примере я бы заподозрил, что' doSomethingElse() 'всегда будет запускать – scniro

2

Не совсем уверен, что ваши трудности наблюдают деталь, если она по размаху уже. Не могли бы вы немного рассказать об этом? Несмотря на это, вот два решения, которые должны охватывать почти все случаи. Для того, чтобы следить за изменениями атрибутов, соблюдайте следующие правила ...

scope.$watch(function() { 
    return elem.attr('my-attribute'); 
}, function(n, o) { 
    if(n) 
     console.log(n); 
}); 

JSFiddle Link - часы приписывать демо


Но я подозреваю, что вы испытываете трудности получения элемента по размаху. Если да, то вот способ, чтобы назначить его через $observe затем смотреть его оттуда без изолята ...

attrs.$observe('myAttribute', function(value) { 
    scope.myValue = value; 
}); 

scope.$watch('myValue', function(n, o) { 
    if(n) 
     console.log(n); 
}); 

JSFiddle Link - часы атрибут демо с помощью $observe

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

  • Нет связанных вопросов^_^