插入ES6 + Angular 1.4指令

时间:2015-08-11 10:24:18

标签: javascript angularjs ecmascript-6 angularjs-interpolate

我目前正在尝试“新的”ES6 + Angular组合,并且不得不在包含范围绑定的指令中插入html字符串。

我尝试过以下选项:

现状

以下代码有效但它使用过滤器而不是指令。

HTML文件

 <div class="thumbnail-body">
     <div ng-bind-html="vm.labels.hello | interpolate:this"></div>
 </div>
模块中的

过滤器(没有ES6的旧学校角)

//TODO: .filter('interpolate', () => new InterpolateFilter())
.filter('interpolate', function ($interpolate) {
  return function (text, scope) {
    if (text) {
      return $interpolate(text)(scope);
    }
  };
});
  

我试图将插值逻辑移向a的原因   指令所以我不必在多个元素上添加过滤器。

工作但丑陋的情况

HTML文件

<interpolate value="vm.labels.hello"  scope="this"></interpolate>

指令

class InterpolateDirective {
  constructor() {    
   this.template = '<div ng-bind-html="value |interpolate:scope"></div>';
   this.restrict = 'E';
   this.scope = {value: '=',scope:'='};
  }
}
export default InterpolateDirective;

模块

.directive('interpolate', () => new InterpolateDirective())

期望的情况(尚未开始工作)

HTML文件

<interpolate value="vm.labels.hello"></interpolate>

指令

class InterpolateDirective {
      constructor($interpolate,$scope) {
      'ngInject';this.template = '<div ng-bind-html="value"> </div>';
      this.restrict = 'E';
      this.scope = {value: '='};
      this.$interpolate = $interpolate;
      this.$scope = $scope;
  }
  //optional compile or link function
  link() {
     this.scope.value = this.$interpolate(this.scope.value)(this);
  }
}
export default InterpolateDirective;

模块

.directive('interpolate', () => new InterpolateDirective())

简而言之:我想与理想的情况合作

1 个答案:

答案 0 :(得分:2)

试试这个:

class InterpolateDirective {
    constructor($interpolate) {
        this.template = '<div ng-bind-html="value"> </div>';
        this.restrict = 'E';
        this.scope = {
            value: '='
        };
        this.$interpolate = $interpolate;

        InterpolateDirective.prototype.link = (scope) =>{
            scope.value = this.$interpolate(scope.value)(this);
        }
    }

    public static Factory() {
        var directive = ($interpolate) => {
            return new InterpolateDirective($interpolate);
        };
        directive['$inject'] = ['$interpolate'];
        return directive;
    }
}
export default InterpolateDirective;


.directive('interpolate', InterpolateDirective.Factory());

指令中的范围不像控制器那样通过依赖注入注入。指令可以通过链接功能的第一个参数访问范围。

指令对象属性定义的范围不相同。它是通过范围隔离创建指令API的配置的一部分。