AngularJS – ng-repeat y ng-show

Obtuve el siguiente código:

<div class="map" ng-controller="DealerMarkerListCtrl"> <a ng-click="showdetails=!showdetails" href="#/dealer/{{marker.id}}" class="marker" style="left:{{marker.left}}px;top:{{marker.top}}px" ng-repeat="marker in dealer"></a> </div> 

y esta vista:

 <div ng-show="showdetails" class="alldealermodal"> <div ng-view></div> </div> 

Esta misma function "ng-show" funciona correctamente con solo un enlace fuera de la repetición ng, pero en esta repetición ng no está funcionando.
El enlace debe abrir una superposition. La vista ng también funciona.

¿Qué me estoy perdiendo?

Como ngRepeat crea un nuevo ámbito, los showdetails la showdetails se hace reference fuera de su ng-repeat no son la misma instancia que los showdetails la showdetails se actualizan en su ng-click repetido.

Puede ver esta publicación para get más detalles, pero una forma de rodear el (los) nuevo (s) ámbito (s) es vincularse a una propiedad del object en lugar de un tipo primitivo.

Este violín muestra un pequeño ejemplo de enlace a los details.show showdetails lugar de showdetails con:

$scope.details = { show: true };

"¿Qué me estoy perdiendo?"

Como @Gloopy ya se mencionó, probablemente no se dio count de que ng-repeat crea ámbitos secundarios (uno para cada elemento). Además, también es necesario comprender cómo funciona la inheritance prototípica de JavaScript porque cada ámbito hijo henetworkinga de manera prototípica del mismo ámbito principal y eso afecta cómo JavaScript encuentra (o crea) properties en los ámbitos.

Tenga en count que varias directivas integradas de Angular crean ámbitos secundarios: ng-repeat, ng-include, ng-switch, ng-controller, directivas (puede, pero puede que no). Para (mucha) más información sobre cómo funciona la inheritance prototípica, por qué es un problema cuando se trata de vincular a primitivos, y cómo se relaciona con los ámbitos angulares, consulte aquí .

Para extender la respuesta de @ Gloopy, hay otras dos alternativas que podrías considerar:

  1. use $parent dentro de ng-repeat para enlazar con la propiedad del scope principal (en lugar de crear properties de ámbito hijo):
    <a ng-click="$parent.showdetails=!$parent.showdetails" ...
  2. defina un método en el ámbito primario y llámelo, cambiando también una propiedad de ámbito principal (en lugar de las properties de ámbito hijo):
    <a ng-click="toggleDetails()" ...