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