Twitter bootstrap AngularJS-$watch即使值更改也不会触发

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; } }

我将AngularJS与twitter引导一起使用

我有一个表,该表属于父控制器。
我有一个弹出窗口,它属于子控制器

当用户单击表中的一行时,将显示弹出窗口,其中包含有关所选行的更多信息

以下是我当前的代码:

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(){..}),将
$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分钟左右解释的。。。