我目前正在尝试“新的”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())
简而言之:我想与理想的情况合作
答案 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的配置的一部分。