Twitter bootstrap AngularJS-$watch即使值更改也不会触发
我将AngularJS与twitter引导一起使用 我有一个表,该表属于父控制器。Twitter bootstrap AngularJS-$watch即使值更改也不会触发,twitter-bootstrap,angularjs,Twitter Bootstrap,Angularjs,我将AngularJS与twitter引导一起使用 我有一个表,该表属于父控制器。 我有一个弹出窗口,它属于子控制器 当用户单击表中的一行时,将显示弹出窗口,其中包含有关所选行的更多信息 以下是我当前的代码: function ParentCtrl($scope) { //called when a row is clicked $scope.showMoreInfo = function() { $scope.showModal = true; } }
我有一个弹出窗口,它属于子控制器 当用户单击表中的一行时,将显示弹出窗口,其中包含有关所选行的更多信息 以下是我当前的代码:
function ParentCtrl($scope) {
//called when a row is clicked
$scope.showMoreInfo = function() {
$scope.showModal = true;
}
}
function ChildCtrl($scope) {
$scope.$watch('showModal', function() {
if($scope.$parent.showModal !== true) {
return;
}
//Show the popup - #myModal is the ID of the popup div
jQuery("#myModal").modal("show");
});
//When the popup is closed, change the value
jQuery("#myModal).on("hide", function() {
$scope.$parent.showModal = false;
});
}
现在,这种机制工作得很好——当用户单击该行时,弹出窗口将显示该行的详细信息(我使用一个服务将详细信息从ParentCtrl传输到ChildCtrl,我在这里没有包括该服务,以关注手头的问题)。当用户单击弹出窗口中的“X”或关闭按钮时,模式将按预期关闭。在该行上进一步单击也可以顺利进行,弹出窗口如预期所示 我的问题在于单击弹出窗口外的区域关闭弹出窗口。基本上,如果您使用过bootstrap modals(),您将知道弹出窗口外有一个区域在后台隐约显示网页,并且也可以通过单击弹出窗口外的区域来关闭弹出窗口-这不是通过“X”或关闭弹出窗口中的按钮,但只需在弹出窗口容器外部单击即可 虽然
jQuery(#myModal”).on('hide',function(){..})调用code>,将$scope.$parent.showmodel
的值设置为false,将永远不会触发$scope.$watch(..)
。
当用户以这种方式关闭弹出窗口后单击另一行时,尽管$scope.showmodel
设置为true,但$scope.$watch(…)
不会再次触发
知道当用户以异常方式关闭弹出窗口时会出现什么问题吗?这里有什么解决方案吗?每当作用域属性在外部发生更改时(如DOM事件),您需要引起$digest
循环
要执行此操作,请在更改属性后添加$scope.$apply()
//When the popup is closed, change the value
jQuery("#myModal).on("hide", function() {
$scope.$parent.showModal = false;
$scope.$apply();
});
总之,正如@ganaraj所说的,阅读。必须将所有dom操作包含在一个指令中,决不在控制器中。您看到了吗?特别是常见的陷阱->Dom操作部分?感谢您指出它;虽然我需要在AngularJS上做更多的工作来理解为什么我必须将DOM操作移动到一个指令中……但我将代码移动到了一个指令中,甚至在那时问题也发生了。我必须使用$scope.$apply()
使它也在指令中工作(我的想法是相反的)。无论如何,显然,正确的方法是`$scope.$apply(function(){$scope.$parent.showmodel=false});-与异常有关。这是在24分钟左右解释的。。。