Eu tenho uma diretiva com um escopo isolado (para que eu possa reutilizar a diretiva em outros lugares) e, quando uso essa diretiva com um ng-repeat
, ela não funciona.
Eu li toda a documentação e as respostas do Stack Overflow sobre este tópico e compreendo os problemas. Eu acredito que evitei todas as pegadinhas usuais.
Portanto, eu entendo que meu código falha devido ao escopo criado pela ng-repeat
diretiva. Minha própria diretiva cria um escopo isolado e faz uma vinculação de dados bidirecional a um objeto no escopo pai. Minha diretiva atribuirá um novo valor de objeto a esta variável associada e isso funciona perfeitamente quando minha diretiva é usada sem ng-repeat
(a variável pai é atualizada corretamente). No entanto, com ng-repeat
, a atribuição cria uma nova variável no ng-repeat
escopo e a variável pai não vê a mudança. Tudo isso é o esperado com base no que li.
Também li que, quando há várias diretivas em um determinado elemento, apenas um escopo é criado. E que um priority
pode ser definido em cada diretiva para definir a ordem em que as diretivas são aplicadas; as diretivas são classificadas por prioridade e, em seguida, suas funções de compilação são chamadas (procure a palavra prioridade em http://docs.angularjs.org/guide/directive ).
Então, eu esperava poder usar a prioridade para garantir que minha diretiva seja executada primeiro e acabe criando um escopo isolate e, quando for ng-repeat
executada, reutilize o escopo isolate em vez de criar um escopo que herda prototipicamente do escopo pai. A ng-repeat
documentação afirma que essa diretiva é executada em nível de prioridade 1000
. Não está claro se 1
é um nível de prioridade mais alto ou um nível de prioridade mais baixo. Quando usei nível de prioridade 1
na minha diretiva, não fez diferença, então tentei 2000
. Mas isso torna as coisas piores: minhas ligações bidirecionais se tornam undefined
e minha diretriz não exibe nada.
Eu criei um violino para mostrar meu problema . Eu comentei a priority
configuração em minha diretiva. Eu tenho uma lista de objetos de nome e uma diretiva chamada name-row
que mostra os campos de nome e sobrenome no objeto de nome. Quando um nome exibido é clicado, eu quero definir uma selected
variável no escopo principal. A matriz de nomes e a selected
variável são passadas para a name-row
diretiva usando vinculação de dados bidirecional.
Eu sei como fazer isso funcionar chamando funções no escopo principal. Também sei que se selected
estiver dentro de outro objeto e me vincular ao objeto externo, as coisas funcionarão. Mas não estou interessado nessas soluções no momento.
Em vez disso, as perguntas que tenho são:
- Como evito a
ng-repeat
criação de um escopo que herda prototipicamente do escopo pai e, em vez disso, faço com que ele use o escopo isolate da minha diretiva? - Por que o nível de prioridade
2000
na minha diretiva não está funcionando? - Usando o Batarang, é possível saber que tipo de escopo está em uso?
ng-repeat
. Eu acho que é valioso poder misturar diretivas autônomas com ng-repeat
. Continua ...
ng-repeat
não deveria haver um escopo. ng-repeat
ter um escopo faz sentido para o caso de uso típico, portanto, não estou sugerindo que ele seja alterado. Em vez disso, como comentei na resposta de Alex Osborn, acho que vou criar uma diretiva de repetição baseada em ng-repeat
que não cria seu próprio escopo. Isso pode ser usado para repetir diretivas que têm seus próprios escopos isolados. A ser continuado ...
ng-repeat
ou a diretiva de repetição sem escopo personalizada. Acho que está tudo bem para o "chamador" saber disso, mas não é bom para um "receptor" (a diretiva sendo repetida) saber se ela está sendo repetida ou não. A ser continuado ...
scope: true
para sua diretiva. Veja também (se ainda não o fez) stackoverflow.com/questions/14914213/… Além disso, só porque uma diretiva será usada em vários lugares não significa que devemos usar automaticamente um escopo isolado.