Aquí está el violín que muestra el problema. http://jsfiddle.net/Erk4V/1/
Parece que si tengo un modelo ng dentro de un ng-if, el modelo no funciona como se esperaba.
Me pregunto si esto es un error o si estoy malinterpretando el uso adecuado.
<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
y agreguéng-if
elementos alrededor de la directiva: los ámbitos se vincularon inicialmente, pero se separaron después de que un observador actualizó uno de los valores de alcance ...Respuestas:
La
ng-if
directiva, como otras directivas, crea un ámbito secundario. Vea el script a continuación (o este jsfiddle )Por lo tanto, su casilla de verificación cambia el
testb
interior del ámbito secundario, pero no el ámbito primario externo.Tenga en cuenta que si desea modificar los datos en el ámbito primario, deberá modificar las propiedades internas de un objeto como en el último div que agregué.
fuente
$scope.obj = {...}
yng-model="obj.someProperty"
supera esta limitación.Puede usar
$parent
para referirse al modelo definido en el ámbito principal como estefuente
ng-model="$parent.$parent.foo
porque ya estoy dentro de un alcance con unng-repeat
- ¿es esta realmente la mejor manera?Puede usar la directiva ngHide (o ngShow) . No crea el ámbito secundario como lo hace ngIf.
fuente
ngIf
entonces crea un ámbito secundario? Me parece muy extraño.ng-hide
no cambia la estructura html. Simplemente cambia los estilos CSS.ng-if
es más complejo: elimina e inserta partes html según la condición. Crea un ámbito secundario para almacenar el estado (al menos debe almacenar la parte oculta html).Tuvimos esto en muchos otros casos, lo que decidimos internamente es tener siempre un contenedor para el controlador / directiva para que no necesitemos pensarlo. Aquí está su ejemplo con nuestro contenedor.
Espero que esto ayude, Yishay
fuente
Sí, la directiva ng-hide (o ng-show) no creará un ámbito secundario.
Aquí está mi práctica:
http://jsfiddle.net/bn64Lrzu/
fuente
Puedes hacerlo así y tu función de mod funcionará perfectamente, avísame si quieres un bolígrafo de código
fuente