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-repeatdiretiva. 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-repeatescopo 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 prioritypode 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-repeatexecutada, reutilize o escopo isolate em vez de criar um escopo que herda prototipicamente do escopo pai. A ng-repeatdocumentaçã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 1na minha diretiva, não fez diferença, então tentei 2000. Mas isso torna as coisas piores: minhas ligações bidirecionais se tornam undefinede minha diretriz não exibe nada.
Eu criei um violino para mostrar meu problema . Eu comentei a priorityconfiguração em minha diretiva. Eu tenho uma lista de objetos de nome e uma diretiva chamada name-rowque mostra os campos de nome e sobrenome no objeto de nome. Quando um nome exibido é clicado, eu quero definir uma selectedvariável no escopo principal. A matriz de nomes e a selectedvariável são passadas para a name-rowdiretiva usando vinculação de dados bidirecional.
Eu sei como fazer isso funcionar chamando funções no escopo principal. Também sei que se selectedestiver 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-repeatcriaçã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
2000na 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-repeatnão deveria haver um escopo. ng-repeatter 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-repeatque 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-repeatou 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: truepara 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.