AngularJS在自定义指令的html标记中使用自定义过滤器?

AngularJS在自定义指令的html标记中使用自定义过滤器?,angularjs,filter,directive,Angularjs,Filter,Directive,我有一个指令,其模板如下所示: <span> {{foo.bar}} {{foo.car}} {{foo.dar}}</span> 但这可能是一厢情愿 如果不可能,是否有一种方法可以在指令控制器中使用过滤器,而不必在指令使用的任何地方应用过滤器 谢谢 编辑:筛选代码: import angular from 'angular'; function someFilter() { return (input, filterParam) => {

我有一个指令,其模板如下所示:

<span> {{foo.bar}} {{foo.car}} {{foo.dar}}</span>
但这可能是一厢情愿

如果不可能,是否有一种方法可以在指令控制器中使用过滤器,而不必在指令使用的任何地方应用过滤器

谢谢

编辑:筛选代码:

import angular from 'angular';
function someFilter() {
    return (input, filterParam) => {
        if (input && filterParam && input.length)
            if(filterParam)
                return input.filterLogic();
        return input;
    }
}

在模板化字符串
{{somedata | someFilter}}
中,过滤器工作正常。但是我正在寻找一种将过滤器应用于指令标记本身的方法。

我不确定您问题的第一部分是什么意思。如果要将此筛选器应用于指令的编译结果,我不确定是否可以。不过,我可以在控制器中使用过滤器

如果您这样定义自定义AngularJS过滤器:

app.filter('makeItPretty', function() {

    return function(value) {
        return value.toUpperCase();
    };

});
然后,您可以通过注入内置的
$filter
服务从控制器中访问过滤器:

app.controller('MyController', function($filter) {
    var makeItPretty = $filter('makeItPretty');
    var myPrettyText = makeItPretty('tHiS iS UgLy!');
});

要准确地执行您想要的操作:

对html标记中的指令生成的字符串使用过滤器

您需要创建一个模板字符串并重新编译DOM

这是AngularJS的高级用法。我希望你喜欢:-)

var-app=angular.module(“app”,[]);
应用程序控制器('ctrl',函数($scope){
$scope.foo={
酒吧:“1”,
汽车:“2”,
dar:“3”
};
});
应用程序指令('foodir',函数($compile){
返回{
限制:'E',
范围:{
foo:“=”,//将变量绑定到指令的作用域
筛选器:'@'//只需获取用于编译的字符串
},
链接:函数($scope、$element、$attrs){
//这是您可能要应用筛选器的字符串
var string_template='“bar:+foo.bar+”car:+foo.car+“dar:+foo.dar';
//要编译的完整字符串,无需筛选器
var html='{{'+string_template+'}}';
如果($scope.filter!==未定义)
//要使用筛选器编译的完整字符串(可选)
html='{{'+string_template+'|'+$scope.filter+'}}}';
log(html);
var e=$compile(html)($scope);//将字符串转换为DOM元素
$element.replaceWith(e);//将其作为指令的内容
}
}
});




不确定是否理解您的问题。你能提供一个当前过滤器的工作示例并展示你期望的结果吗?是的,我正在试图找到一种方法,在html标记中的指令产生的字符串上使用过滤器。当前过滤器为:``从'angular'导入angular';函数SomeFilter(){return(input,filterParam)=>{if(input&&filterParam&&input.length){if(filterParam){return input.filterLogic();}}}}return input;;}}导出默认角度.module('filters.SomeFilter',[]).filter('SomeFilter',SomeFilter'.姓名```当模板化
{stringData | someFilter:param}}
时,过滤器工作,但我希望能够将过滤器应用于作为指令结果的字符串,而不是将其包含在指令本身中,因此它只能在某些区域使用。请使用此代码更新您的问题。在注释中不太可读;)编辑了原文。很抱歉,我遵循了更多的指导,但我最终得到了一个非常复杂的结果,一个过滤器只应用于指令的某些部分,而不是全部。我认为这个解决方案需要重新编译。使用
$compile
确实是高级的AngularJS。而且,我认为没有必要。这似乎相当于注入
$filter
,并在将其附加到范围之前使用它将自定义过滤器应用到输出。这也是我最初的想法。但深入研究之后,我发现没有办法对innerHTML全局应用过滤器。如果你有解决办法,我很乐意读。更不用说应用过滤器及其通过元素属性提供的参数了。我认为,尽管实用价值有限,但可能有一个更高优先级的独立指令,该指令会短路编译,执行自己的编译,然后将指定的过滤器应用于输出。如果一个自定义指令正在构建中,那么构建它以一种更传统的方式应用过滤器就更实际了。听起来不错。我同意应该把这个指令分成两部分,
foodir
typee和
filterdir
typea。我会尝试拿出你建议的东西。我想明年是因为到那时我的时间不多了,这个问题有一个有效的答案:-D谢谢@JCFord的建议!
app.filter('makeItPretty', function() {

    return function(value) {
        return value.toUpperCase();
    };

});
app.controller('MyController', function($filter) {
    var makeItPretty = $filter('makeItPretty');
    var myPrettyText = makeItPretty('tHiS iS UgLy!');
});