Javascript AngularJS-ng repeat生成的控制器实例内的事件问题

Javascript AngularJS-ng repeat生成的控制器实例内的事件问题,javascript,angularjs,angularjs-scope,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Scope,Angularjs Ng Repeat,今天我遇到了一个听起来很奇怪的问题,但肯定有一些合乎逻辑的解释 我正在构建一个表,允许在其中内联编辑字段值。例如,您会看到一个带有标题的范围,如果单击它,将显示内联编辑 这是ng repeat的包装器 <div ng-repeat="product in products" ng-controller="ProductController"> </div> 然后标记 <div class="inventory-field inventory-row-minstoc

今天我遇到了一个听起来很奇怪的问题,但肯定有一些合乎逻辑的解释

我正在构建一个表,允许在其中内联编辑字段值。例如,您会看到一个带有标题的范围,如果单击它,将显示内联编辑

这是ng repeat的包装器

<div ng-repeat="product in products" ng-controller="ProductController">
</div>
然后标记

<div class="inventory-field inventory-row-minstock inline-edit inline-edit-regular">
   <span ng-hide="inlineEditionGetStatus('minstock')" ng-click="setInlineEdition('minstock')">{{product.min_stock}}</span>
   <div ng-show="inlineEditionGetStatus('minstock')" class="dev-inline-editor clearfix">      <input  type="text" ng-model="product.min_stock" />
    <input type="button" ng-click="inlineEditionEnd('minstock')" value="Ok" />
   </div>
</div>

{{product.min_stock}
inlineGetStatus返回true或false。它应该将编辑器隐藏在一个真值上,这解释了为什么$scope.$on(“inlineEditWrapperClicked”需要一个真值

主div内的span显示字段值,单击时显示输入。其思想是,当您在内联编辑器外单击时,它将消失,span将恢复为可见状态

一切都像一个符咒…但是

例如,当我有一个有三行的表时,我可以打开三个内联编辑器,单击它们一次。在那里之前一切都很好。如果我在最后一行的编辑器外单击,该编辑器将被隐藏,显示字段值的范围将被恢复。但是如果我在第一行的第一个编辑器外单击,第一、第二和第三个编辑器rs将同时被隐藏。这看起来像是控制器实例的连锁效应

我尝试过使用$emit,$broadcast,但似乎没有任何东西可以修复不希望出现的效果。我被困在这里,所以如果有人能启发我,我将不胜感激

真正奇怪的是,每次我记录一个来自getter getInlineEditorStatus()的属性时,它返回的日志数量与我拥有的控制器实例(或行)数量相同。我无法仅访问所需的范围实例

我真的很想提前感谢你们能给我的任何帮助

问候,


Guillermo

您可以为内联编辑器创建一个具有独立作用域的指令,并为页面使用单个控制器。这将有两个优点,首先内联编辑器可以在其他地方轻松重用,页面控制器可能更容易处理,因为只有一个实例。我认为还将修复您遇到的错误

像这样在ng重复中创建多个控制器会使我的spidey感觉受挫…

$scope.$on(“documentclick”,函数(e){$scope.$apply(函数(){$scope.terminateInlineEdition();})});
最初在子控制器外部,在主控制器内部,但问题是相同的。
<div class="inventory-field inventory-row-minstock inline-edit inline-edit-regular">
   <span ng-hide="inlineEditionGetStatus('minstock')" ng-click="setInlineEdition('minstock')">{{product.min_stock}}</span>
   <div ng-show="inlineEditionGetStatus('minstock')" class="dev-inline-editor clearfix">      <input  type="text" ng-model="product.min_stock" />
    <input type="button" ng-click="inlineEditionEnd('minstock')" value="Ok" />
   </div>
</div>