ng-if, ng-hide y ng-show nos sirven para mostrar u ocultar algún elemento de nuestra interfaz, pero lo hacen de forma diferente.

ng-if remueve el elemento del DOM, mientras que ng-hide o ng-show sólo lo ocultan mediante atributos HTML. En AngularJS esta diferencia es importante ya que además de esto, el primero crea un nuevo scope y los otros no. Esto quiere decir que para utilizar las variables de nuestro scope principal tenemos que hacerlo a través del atributo $parent o utilizando un objeto para almacenar nuestras variables, ya que al hacerlo así el mecanismo de js buscaría la propiedad en el scope actual y si no la encuentra la buscaría en el padre.

usando $parent

<input type="text" ng-model="data">
<div ng-if="true">
    <input type="text" ng-model="$parent.data">
</div>

utilizando un objeto

<input type="text" ng-model="data.input">
<div ng-if="true">
    <input type="text" ng-model="data.input">
</div>

Fuentes:
http://stackoverflow.com/questions/19177732/what-is-the-difference-between-ng-if-and-ng-show-ng-hide

Anuncios

Fuentes:

http://stackoverflow.com/questions/23455718/why-is-my-ng-model-variable-undefined-in-controller
http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html

En un reporte de BIRT necesitaba desplegar en el encabezado el mes de acuerdo a un parámetro. Dicho parámetro se recibe como una cadena del “01”-“12” porque para la consulta necesito que sean 2 dígitos. Para determinar el mes, realizaba lo siguiente en el evento “initialize” del reporte:

meses="ENERO","FEBRERO","MARZO","ABRIL","MAYO"
    ,"JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE"
    ,"NOVIEMBRE","DICIEMBRE"];
params["Titulo"]=meses[parseInt(params["MES"])-1]+" del "+params["ANYO"];

Y funcionaba, eso creía yo, hasta que me dijeron que en Agosto(“08”) y Septiembre(“09”) aparecía la leyenda “undefined” en el título del reporte. Pues la causa de esto, es la interpretación que hace la función parseInt cuando le pasamos una cadena que comienza con “0” (recordemos que el código del reporte es Javascript), aquí encuentras la explicación. Para resolverlo, podemos hacer lo siguiente:

params["Titulo"]=meses[parseInt(params["MES"]
    ,10)-1]+" del "+params["ANYO"];

Simplemente le pasamos un segundo parámetro a la función parseInt para indicarle que la cadena(número) que le estamos pasando es en base 10 y no intente interpretarlo como un número octal.
Listo, ya podemos generar el reporte para Agosto y Septiembre 😉