【问题标题】:Adding Angular directive using decorator使用装饰器添加 Angular 指令
【发布时间】:2016-04-13 17:06:45
【问题描述】:

我正在使用带有 Angular UI 的 Angular 1.4.8。我要做的是装饰ui-sref 指令,这样如果当前$state.nameui-sref 状态匹配,它将突出显示菜单元素(通过设置CSS 类'active')。

我测试该元素是否是我的导航标头的后代,如果是,我想为该元素添加一个ngClass 属性。现在,我只想让它们都突出显示;我可以稍后添加测试以匹配状态。 true 将替换为实际测试。现在我只想要active 类集

.config(['$provide', ($provide: angular.auto.IProvideService) => {
    return $provide.decorator('uiSrefDirective', [
        '$delegate', ($delegate) => {
            var originalUiSref = $delegate[0];
            var originalUiSrefLink = originalUiSref.link;

            originalUiSref.compile = () => (scope, element, attrs, uiSref) => {
                var topBar = $('nav.top-bar');
                if (topBar.length > 0 && $.contains(topBar[0], element[0])) {
                    element.parent().attr('ng-class', '{ active: true }');    
                }

                originalUiSrefLink.call($delegate, scope, element, attrs, uiSref);
            };

            return $delegate;
        }
    ]);
}])

原始 DOM 元素:

<a ui-sref="requests">Requests</a>

添加装饰器后,这是我在浏览器的 DOM 中看到的:

<a ui-sref="requests" ng-class="{ active: true }" href="/requests">Requests</a>

太棒了!我可以在 DOM 中看到添加的属性,但我的浏览器忽略了它。这几乎就像是在 Angular 扫描 DOM 以获取指令之后添加它。如果我将代码更改为:

element.parent().addClass('active');

...然后它工作正常。 我做错了什么?

【问题讨论】:

标签: javascript angularjs angular-ui-router angular-directive angular-decorator


【解决方案1】:

艾米你不需要实现这个指令,因为angular-ui其实已经有了,请检查ui-sref-active

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2017-11-19
    • 2017-08-24
    相关资源
    最近更新 更多