我一直试图影响父作用域中的变量来从指令内部切换ng-show.该指令是包含ng-repeat指令的自定义指令.这个想法是,一旦ng-repeat完成,我想隐藏包含div以及它内部的元素.
这是一个Plunkr展示我的情况:http://beta.plnkr.co/edit/C42Z25?p=preview
这里也是JSFiddle中的比较,它使用相同的问题,但它不是ng-repeat,因此它可以工作:http://jsfiddle.net/dyzPC/
所以有几个问题.在我的指令中,我必须使用scope.$parent.showMe = true来更改父作用域的showMe,我似乎无法使用scope.showMe = true来设置它.我尝试使用隔离范围,没有范围,真正的范围,似乎没有任何效果.
此外,在jquery回调函数中,我似乎无法将父作用域showMe重置为作用域.$parent.showMe = false.这可以防止我在有内容时显示包含div,并在没有内容时隐藏它.
另一方面,最后一个问题是使用$last.在plunkr示例中,使用$last是可能的,但在我的实际代码中,ng-repeat集合正在从HTTP响应拦截器填充.这似乎可以防止使用$last,因为所有元素最终都是$last = true.还有另一种检测ng-repeat完成时间的方法吗?
最佳答案 在你的指令中,你需要包装范围.$parent.showMe = false;在范围内.$apply():
scope.$parent.showMe = true; //this one works
element.hide().fadeIn('fast').delay(2000).fadeOut('slow', function(){
scope.$apply(function(){
scope.$parent.showMe = false;
});
});
这是因为您正在更改Angular(您的jQuery函数)之外的Angular属性的值,因此Angular不知道scope.showMe已更改.
您的指令与ngRepeat位于同一个标记中,您不能使用隔离范围,因为它会删除ng-repeat =“httpMessage in messages”中的绑定.换句话说,如果您在此处隔离范围,则httpMessages将不存在.