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!');
});