今天我遇到了一个听起来很奇怪的问题,但肯定有一些合乎逻辑的解释......
我正在构建一个允许内联编辑字段值的表。例如,您会看到一个带有标题的跨度,然后如果单击它,则会出现内联编辑。
这是 ng-repeat 的包装
<div ng-repeat="product in products" ng-controller="ProductController">
</div>
如您所见,每次迭代都会创建 ProductController 的新实例。产品控制器触发一些事件,并相应地捕获它们。
myApp.controller('ProductController', function ($scope, $filter, $http, $document) {
//Show publications flag
$scope.showPublications = false;
//Inline edition object
$scope.inlineEdition = {
enabled: false,
title: false,
sku: false,
realstock: false,
minstock: false
};
$document.bind('click', function(e) {
e.stopPropagation();
//Dispatch an event
$scope.$emit("documentclick");
});
angular.element(".dev-inline-editor").bind('click', function(e) {
e.stopPropagation();
});
angular.element(".inline-edit").bind('click', function(e) {
e.stopPropagation();
//Dispatch an event
$scope.$broadcast("inlineEditWrapperClicked",[$scope.inlineEditionGetStatus('enabled')]);
});
angular.element(".inventory-field span").bind('click', function(e) {
e.stopPropagation();
});
$scope.$on("inlineEditWrapperClicked", function(e, inlineStatus) {
if(inlineStatus[0] === true) {
$scope.$apply(function () {
$scope.terminateInlineEdition();
e.stopPropagation();
})
}
});
$scope.$on("documentclick", function (e) {
$scope.$apply(function() {
$scope.terminateInlineEdition();
})
});
//Code goes on...
然后标记...
<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>
inlineGetStatus 返回真或假。它应该将编辑器隐藏在一个真值上,这解释了为什么 $scope.$on("inlineEditWrapperClicked" 需要一个真值。
主 div 内的跨度显示字段值,单击时显示输入。这个想法是当你点击内联编辑器外部时,它会消失,span会恢复到可见状态。
一切都像一个魅力......但是......
例如,当我有一个包含三行的表格时,我可以打开三个内联编辑器,单击它们一次。一切都很好,直到那里。如果我在最后一行的编辑器外部单击,该编辑器将被隐藏,并且显示字段值的跨度将恢复。但是如果我在第一行的第一个编辑器之外单击,第一、第二和第三个编辑器将同时隐藏。这似乎是控制器实例向下的连锁效应。
我尝试过使用 $emit、$broadcast,但似乎没有任何东西可以解决不良影响。我被困在这里,所以如果有人能启发我,我将不胜感激。
真正奇怪的是,每次我记录一个来自 getInlineEditorStatus(); 的属性时。它返回的日志与我拥有的控制器实例(或行)一样多。我不能只访问我需要的范围实例。
我真的很想提前感谢你们能给我的任何帮助。
问候,
吉列尔莫