从AngularJS指令访问属性


95

我的AngularJS模板包含一些自定义HTML语法,例如:

<su-label tooltip="{{field.su_documentation}}">{{field.su_name}}</su-label>

我创建了一个指令来处理它:

.directive('suLabel', function() {
  return {
    restrict: 'E',
    replace: true,
    transclude: true,
    scope: {
      title: '@tooltip'
    },
    template: '<label><a href="#" rel="tooltip" title="{{title}}" data-placement="right" ng-transclude></a></label>',
    link: function(scope, element, attrs) {
      if (attrs.tooltip) {
        element.addClass('tooltip-title');
      }
    },
  }
})

一切正常,但attrs.tooltip表达式始终返回undefined,即使tooltip在执行时从Google Chrome浏览器的JavaScript控制台可见该属性,该表达式始终返回console.log(attrs)

有什么建议吗?

更新:Artem提供了一种解决方案。它包括这样做:

link: function(scope, element, attrs) {
  attrs.$observe('tooltip', function(value) {
    if (value) {
      element.addClass('tooltip-title');
    }
  });
}

AngularJS + stackoverflow =幸福


这个对另一个问题的答案说明了如何在AngularJS中正确表达三元数。
伊斯梅尔·加利米

所以极本:“AngularJS +计算器=幸福”

Answers:



25

尽管在特定情况下使用'@'比使用'='更合适,但有时我使用'=',这样我就不必记住使用attrs。$ observe()了:

<su-label tooltip="field.su_documentation">{{field.su_name}}</su-label>

指示:

myApp.directive('suLabel', function() {
    return {
        restrict: 'E',
        replace: true,
        transclude: true,
        scope: {
            title: '=tooltip'
        },
        template: '<label><a href="#" rel="tooltip" title="{{title}}" data-placement="right" ng-transclude></a></label>',
        link: function(scope, element, attrs) {
            if (scope.title) {
                element.addClass('tooltip-title');
            }
        },
    }
});

小提琴

使用'=',我们获得双向数据绑定,因此必须注意确保scope.title不会在指令中意外修改。好处是,在链接阶段,将定义本地范围属性(scope.title)。


嗨,马克,您对使用这些解决方案有何看法,在链接属性上使用“观察”与使用双向数据绑定是否有特定的指南?我认为使用双向数据绑定看起来更干净,但是我想知道是否有理由不使用它?
Jeroen

@Jeroen,我在这里发布了关于@vs 的更长的讨论。=
Mark Rajcok'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.