Angularjs 如果依赖元素不消失,则为ng

Angularjs 如果依赖元素不消失,则为ng,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我有以下问题: 单击按钮时,我的搜索结果窗口打开,因为“displayResults”设置为“true”。但是,当单击关闭按钮时,即使$scope.displayResults再次设置为false,它也不会关闭 html 诸如此类: ❌ .... 安格拉斯 $http({ method : "POST", url : "/searchFor", data: {item: sI, dID

我有以下问题:

单击按钮时,我的搜索结果窗口打开,因为“displayResults”设置为“true”。但是,当单击关闭按钮时,即使
$scope.displayResults
再次设置为
false
,它也不会关闭

html


诸如此类:
❌
    ....
安格拉斯

         $http({
            method : "POST",
            url : "/searchFor",
            data: {item: sI, dID: searchID}
          }).then(function(response){

            if(response.data.length > 0 || response.data != 'undefined'){

                $("#sidebar").css({pointerEvents: "none"});
                $("#default").css({pointerEvents: "none"});

                $scope.displayResults = true;
                $scope.sItems = [];

                for(let i = 0; i < response.data.length; i++){
                    $scope.sItems[i] = response.data[i];
                }

                window.setTimeout(function(){
                    $("#closeMenuS").click(function(){
                        $scope.displayResults = false;

                        $("#sidebar").css({pointerEvents: "auto"});
                        $("#default").css({pointerEvents: "auto"});
                    });
                }, 30);



            }

         }, function myError(response) {

                $scope.myWelcome = response.statusText;

          });
$http({
方法:“张贴”,
url:“/searchFor”,
数据:{item:sI,dID:searchID}
}).然后(功能(响应){
if(response.data.length>0 | | response.data!=“未定义”){
$(“#边栏”).css({pointerEvents:“none”});
$(“#默认值”).css({pointerEvents:“none”});
$scope.displayResults=true;
$scope.sItems=[];
for(设i=0;i
如果您在jQuery侦听器的回调中,则需要显式应用更改。试试这个:

                window.setTimeout(function(){
                    $("#closeMenuS").click(function(){
                        $scope.displayResults = false;
                        $scope.$apply();
                        $("#sidebar").css({pointerEvents: "auto"});
                        $("#default").css({pointerEvents: "auto"});
                    });
                }, 30);

如果您在jQuery侦听器的回调中,则需要显式应用更改。试试这个:

                window.setTimeout(function(){
                    $("#closeMenuS").click(function(){
                        $scope.displayResults = false;
                        $scope.$apply();
                        $("#sidebar").css({pointerEvents: "auto"});
                        $("#default").css({pointerEvents: "auto"});
                    });
                }, 30);

AngularJs有自己的超时实现。通过使用本机
setTimeout()
可以隐藏您试图对angular执行的操作。 结果是AngularJs不知道您的
$scope
发生了变化

正确的方法是注入
$timeout
服务,并用
$timeout
替换您的
setTimeout()
调用(为了简化,我去掉了其余的代码):

这就是Itamar建议的
$apply()
函数起作用的原因。您基本上是在强制AngularJs检测更改。
但是,更好的做法是使用AngularJs提供的工具,尽可能避免使用本机javascript。

AngularJs有自己的超时实现。通过使用本机
setTimeout()
可以隐藏您试图对angular执行的操作。 结果是AngularJs不知道您的
$scope
发生了变化

正确的方法是注入
$timeout
服务,并用
$timeout
替换您的
setTimeout()
调用(为了简化,我去掉了其余的代码):

这就是Itamar建议的
$apply()
函数起作用的原因。您基本上是在强制AngularJs检测更改。
不过,更好的做法是使用AngularJs提供的工具,尽可能避免使用本地javascript。

谢谢,这非常有效!当我需要使用
apply
时,你能解释一下吗?是的-在任何情况下,如果你不在AngularJS的上下文中,通常会发生在这种情况下-当你在jQuery函数后的回调中,AngularJS的更改检测不会检测到在回调中所做的更改,因此你需要显式调用$scope.$apply()告诉AngularJS-“好的,我做了一个需要注册的更改,如果需要的话更新视图”。希望这会有帮助!别忘了标记答案:-)谢谢,效果很好!当我需要使用
apply
时,你能解释一下吗?是的-在任何情况下,如果你不在AngularJS的上下文中,通常会发生在这种情况下-当你在jQuery函数后的回调中,AngularJS的更改检测不会检测到在回调中所做的更改,因此你需要显式调用$scope.$apply()告诉AngularJS-“好的,我做了一个需要注册的更改,如果需要的话,更新视图”。希望这有帮助!别忘了标记答案:-)谢谢,这解释得很好。=)谢谢,这解释得很好
angular.module("YourModule")
       .controller("YourController", ["$scope", "$timeout", YourController]);

function YourController($scope, $timeout)
{
    ...

    $scope.doSomeMagic = function()
    {
        $timeout(function()
        {
            $("#closeMenuS").click(function()
            {
                $scope.displayResults = false;

                $("#sidebar").css({pointerEvents: "auto"});
                $("#default").css({pointerEvents: "auto"});
            });
        }, 30);
    }

    ...
}