Aqui está o violino mostrando o problema. http://jsfiddle.net/Erk4V/1/
Parece que se eu tiver um modelo ng dentro de um ng-if, o modelo não funcionará conforme o esperado.
Gostaria de saber se isso é um bug ou se estou entendendo mal o uso adequado.
<div ng-app >
<div ng-controller="main">
Test A: {{testa}}<br />
Test B: {{testb}}<br />
Test C: {{testc}}<br />
<div>
testa (without ng-if): <input type="checkbox" ng-model="testa" />
</div>
<div ng-if="!testa">
testb (with ng-if): <input type="checkbox" ng-model="testb" />
</div>
<div ng-if="!someothervar">
testc (with ng-if): <input type="checkbox" ng-model="testc" />
</div>
</div>
</div>
controllerAs
?scope:false
e acrescenteing-if
elemento em torno da directiva - os âmbitos eram obrigados inicialmente, mas eles se separaram depois de um observador atualizadas um dos valores de escopo ...Respostas:
A
ng-if
diretiva, como outras diretivas, cria um escopo filho. Veja o script abaixo (ou este jsfiddle )Portanto, sua caixa de seleção altera o
testb
interior do escopo filho, mas não o escopo pai externo.Observe que, se você quiser modificar os dados no escopo pai, precisará modificar as propriedades internas de um objeto, como na última div que eu adicionei.
fonte
$scope.obj = {...}
eng-model="obj.someProperty"
supera essa limitação.Você pode usar
$parent
para se referir ao modelo definido no escopo pai como estefonte
ng-model="$parent.$parent.foo
porque eu já estou dentro de um escopo com umng-repeat
- este é realmente o melhor caminho?Você pode usar a diretiva ngHide (ou ngShow) . Não cria escopo filho como ngIf.
fonte
ngIf
então, cria um escopo filho? Parece muito estranho para mim.ng-hide
não altera a estrutura html. Simplesmente muda os estilos de CSS.ng-if
é mais complexo: remove e insere peças html, dependendo da condição. Ele cria o escopo filho para armazenar o estado (pelo menos deve armazenar parte html oculta).Tivemos isso em muitos outros casos, o que decidimos internamente é sempre ter um wrapper para a diretiva / controlador, para que não precisemos pensar sobre isso. Aqui está seu exemplo com nosso invólucro.
Espera que isso ajude, Yishay
fonte
Sim, a diretiva ng-hide (ou ng-show) não criará escopo filho.
Aqui está a minha prática:
http://jsfiddle.net/bn64Lrzu/
fonte
Você pode fazer assim e sua função mod funcionará perfeitamente, deixe-me saber se você quer uma caneta de código
fonte