Estou tentando obter um atributo avaliado da minha diretiva personalizada, mas não consigo encontrar a maneira certa de fazê-lo.
Eu criei este jsFiddle para elaborar.
<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);
}
});
o que estou perdendo?
javascript
binding
angularjs
directive
Shlomi Schwartz
fonte
fonte
Respostas:
Aviso: atualizo esta resposta à medida que encontro melhores soluções. Também mantenho as respostas antigas para referência futura, desde que permaneçam relacionadas. A melhor e mais recente resposta vem em primeiro lugar.
Melhor resposta:
As diretivas nos angularjs são muito poderosas, mas leva tempo para compreender quais processos estão por trás delas.
Ao criar diretivas, o angularjs permite criar um escopo isolado com algumas ligações ao escopo pai. Essas ligações são especificadas pelo atributo no qual você anexa o elemento no DOM e como você define a propriedade do escopo no objeto de definição de diretiva .
Existem 3 tipos de opções de ligação que você pode definir no escopo e gravá-las como atributo relacionado a prefixos.
HTML
Nesse caso, no escopo da diretiva (seja na função de vinculação ou no controlador), podemos acessar essas propriedades assim:
Resposta "Ainda OK":
Como essa resposta foi aceita, mas tem alguns problemas, vou atualizá-la para uma melhor. Aparentemente,
$parse
é um serviço que não se encontra nas propriedades do escopo atual, o que significa que apenas utiliza expressões angulares e não pode alcançar o escopo.{{
,}}
expressões são compiladas durante o início do angularjs, o que significa que, quando tentamos acessá-las em nossopostlink
método de diretivas , elas já são compiladas. ( já{{1+1}}
está2
na diretiva).É assim que você deseja usar:
.
Uma coisa que você deve notar aqui é que, se quiser definir a cadeia de valor, coloque-a entre aspas. (Veja a terceira entrada)
Aqui está o violino para brincar: http://jsfiddle.net/neuTA/6/
Resposta antiga:
Não estou removendo isso para pessoas que podem ser enganadas como eu; observe que o uso
$eval
é perfeitamente adequado da maneira correta, mas$parse
tem um comportamento diferente; provavelmente você não precisará disso na maioria dos casos.A maneira de fazer isso é, mais uma vez, usando
scope.$eval
. Além de compilar a expressão angular, também tem acesso às propriedades do escopo atual.O que você está perdendo era
$eval
.fonte
$scope.text
será indefinido na função de vinculação. A maneira como a resposta está atualmente redigida parece que não seria indefinida. Você precisa usar $ observe () (ou $ watch () também funcionará aqui também) para ver de forma assíncrona o valor interpolado. Veja a minha resposta e também stackoverflow.com/questions/14876112/… #$parse
serviço foi injetado e nunca usado. Estou esquecendo de algo?Para um valor de atributo que precisa ser interpolado em uma diretiva que não esteja usando um escopo isolado, por exemplo,
use o método Attributes '
$observe
:Na página da diretiva ,
Se o valor do atributo for apenas uma constante, por exemplo,
você pode usar $ eval se o valor for um número ou booleano e desejar o tipo correto:
Se o valor do atributo for uma constante de sequência, ou você desejar que o valor seja do tipo sequência na sua diretiva, é possível acessá-lo diretamente:
No seu caso, no entanto, como você deseja suportar valores e constantes interpolados, use
$observe
.fonte
As outras respostas aqui são muito corretas e valiosas. Mas, às vezes, você quer apenas simples: obter um valor antigo e analisado na instanciação da diretiva, sem precisar de atualizações e sem mexer no escopo isolado. Por exemplo, pode ser útil fornecer uma carga declarativa em sua diretiva como uma matriz ou objeto hash no formato:
Nesse caso, você pode ir direto ao ponto e usar apenas um bom básico
angular.$eval(attr.attrName)
.Violino de trabalho .
fonte
Para a mesma solução que eu estava procurando
Angularjs directive with ng-Model
.Aqui está o código que resolve o problema.
DOM HTML
Meu resultado é:
fonte
Use $ timeout porque a diretiva chama após o carregamento do DOM, para que suas alterações não se apliquem
fonte