【问题标题】:Why element.addClass in directive doesn't work correctly?为什么指令中的 element.addClass 不能正常工作?
【发布时间】:2012-12-07 14:25:19
【问题描述】:

元素

<button ud-listener="item.status">{{item.value}}</button>

我有以下指令

myApp.directive('myDirective', function()
{
    return {
        restrict: 'A',
        link: function(scope, element, attrs)
        {
            scope.$watch(attrs.myDirective, function(val)
            {
                if(!isUndefined(val))
                {
                    element.addClass(val);
                    setTimeout(function(){
                        element.removeClass(val);
                    }, 2000);
                }
            });
        }
    }
});

我想做的是:

我正在使用 socket-io 接收 json 格式的数据,并且我正在查看包含该值的 myDirective,这是 add/-removeClass 所必需的。

一开始它就像一个魅力,指令将类添加到元素并在 2 秒后将其删除。没有任何问题。但是几分钟后,它不会将类添加到所有元素中,而只是添加到其中的少数元素中。

还有其他方法吗?我只想在元素中添加类并在 2 秒后删除类。

【问题讨论】:

  • 可能是因为您 $watching 的值在几分钟后停止变化?

标签: javascript jquery angularjs


【解决方案1】:

很可能是因为:

您没有引用 JQuery ...或...

您的 JQuery 参考没有出现在之前您的角度参考

   <script src="/scripts/jquery.js" type="text/javascript"></script>
   <script src="/scripts/angular.js" type="text/javascript"></script>

如果 Angular 在加载时看到 JQuery,element 将是一个完整的 JQuery 对象,否则它是 jqLit​​e。

【讨论】:

  • 但是当我刷新页面时,一开始效果很好。一分钟或更短时间后它开始失败。
  • 我想我需要看看代码/小提琴。这可能是您对指令或它绑定到的 DOM 元素所做的事情。
  • 我什至尝试添加.delay(2000),但仍然是同样的问题
  • 我可以尝试制作小提琴,但会很难。因为它是本地客户端上的一个项目,连接到远程节点服务器
  • @blesh,你认为为什么需要 jQuery? addClass() 和 removeClass() 是 jqLite 的一部分,还是你在想别的?
【解决方案2】:

我注意到了几件事:

1。您使用的是setTimeout 而不是$timeout

当你这样做时,你是在 Angular 上下文之外执行你的代码,所以它不知道进行脏检查。换个试试

setTimeout(function(){
   element.removeClass(val);
 }, 2000);

$timeout(function(){
     element.removeClass(val);
}, 2000);

您还需要包含$timeout 作为指令工厂方法的参数。

2。您正在使用 scope.$watch 而不是 attrs.$observe

我不确定这里的后果,但这是我以前经常看到的。

尝试:

attrs.$observe('myDirective', function(val){
 ...
}

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2017-02-02
    • 1970-01-01
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    相关资源
    最近更新 更多