ng-if 依赖元素没有消失
ng-if dependent element not disappearing
我遇到了以下问题:
单击按钮时,我的搜索结果 window 打开,因为 'displayResults' 设置在 'true' 上。但是当点击关闭按钮时,即使 $scope.displayResults
再次设置为 false
它也没有关闭。
html
<section id="searchResults" data-ng-if="displayResults">
<h2>Suchergebnisse:</h2>
<div id="closeMenuS">❌</div>
<ul data-ng-repeat="x in sItems">
....
</ul>
</section>
AngularJS
$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;
});
如果您在 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()
调用(为了简化,我删除了其余代码):
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);
}
...
}
这就是 Itamar 建议的 $apply()
函数起作用的原因。您基本上是在强制 AngularJs 检测更改。
但是,更好的做法是使用 AngularJs 提供的工具,并尽可能避免原生 javascript。
我遇到了以下问题:
单击按钮时,我的搜索结果 window 打开,因为 'displayResults' 设置在 'true' 上。但是当点击关闭按钮时,即使 $scope.displayResults
再次设置为 false
它也没有关闭。
html
<section id="searchResults" data-ng-if="displayResults">
<h2>Suchergebnisse:</h2>
<div id="closeMenuS">❌</div>
<ul data-ng-repeat="x in sItems">
....
</ul>
</section>
AngularJS
$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;
});
如果您在 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()
调用(为了简化,我删除了其余代码):
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);
}
...
}
这就是 Itamar 建议的 $apply()
函数起作用的原因。您基本上是在强制 AngularJs 检测更改。
但是,更好的做法是使用 AngularJs 提供的工具,并尽可能避免原生 javascript。