在我的 AngularJS 应用程序中,有几个点我想等待 a$scope被处理成 DOM,然后在其上运行一些代码,例如 jQuery fadeIn。
有没有办法收听某种“digestComplete”消息?
我目前的方法是:在设置$scope我想要渲染的任何变量后立即使用setTimeout0 毫秒的延迟,这样它就会让作用域完成消化,然后运行代码,效果很好。唯一的问题是,我偶尔会在 setTimeout 返回之前看到 DOM 渲染。我想要一种保证在摘要之后和渲染之前触发的方法。
在这个jQuery 淡入淡出小提琴(我在JSFiddles 示例wiki 页面上找到它)中,作者定义了一个“fadey”指令并在指令的链接函数中执行 jQuery fadeIn(或fadeOut)”
<li ng-repeat="item in items" fadey="500">
...
myApp.directive('fadey', function() {
return {
restrict: 'A',
link: function(scope, elm, attrs) {
var duration = parseInt(attrs.fadey);
if (isNaN(duration)) {
duration = 500;
}
elm = jQuery(elm); // this line is not needed if jQuery is loaded before Angular
elm.hide();
elm.fadeIn(duration)
另一种可能的解决方案是使用$evalAsync:请参阅Miško 的此评论,他在其中指出:
asyncEval 在 DOM 构建之后但在浏览器呈现之前。我相信这是您想要附加 jquery 插件的时候了。否则你会有闪烁。如果你真的想在浏览器渲染后做,你可以做 $defer(fn, 0);
($defer 更名为 $timeout)。
但是,我认为使用指令(因为您正在操作 DOM)是更好的方法。
这是一个SO 帖子,其中 OP 尝试在范围内侦听 $viewContentLoaded 事件(这是另一种选择),以便应用一些 jQuery 函数。建议/答案再次使用指令。
或者,此示例将与 AngularJS 内置的ng-show指令以相同的方式工作,除了它将根据 AngularJS 条件淡入或淡出:
<li ng-repeat="item in items" ng-ds-fade="{condition}">
<!-- E.g.: ng-ds-fade="items.length > 0" -->
...
myApp.directive('ngDsFade', function () {
return function(scope, element, attrs) {
element.css('display', 'none');
scope.$watch(attrs.ngDsFade, function(value) {
if (value) {
element.fadeIn(200);
} else {
element.fadeOut(100);
}
});
};
});
来源: http: //www.codeproject.com/Articles/464939/Angular-JS-Using-Directives-to-Create-Custom-Attri
如果你只想运行一些 jQuery 的东西,为什么不试试 Angular-UI jQuery Passthrough?