考虑以下代码
<body ng-app="myApp">
<h1>Hello {{name}}</h1>
<h2>reverse of your name is {{ name | reverse }}</h2>
<input type="text" ng-model="name">
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.js'></script>
<script>
angular.module('myApp', [])
.filter('reverse', function(){
return function(str){
return str.split('').reverse().join('');
}
});
</script>
</body>
此处感兴趣的位是reverse
过滤器。以下是我的想法:
angular.filter()
。 arg1: strin
g&amp; arg2: function
(准确无名或无名称)Q1。我的理解是否正确?
Q2。有什么区别: 正常版本:
angular.filter('reverse', function(str){
return str.split('').reverse().join('');
});
嵌套版本:
angular.filter('reverse', function(str){
return function(str){
return str.split('').reverse().join('');
}
});
Q3。为什么额外的功能嵌套有用&amp;在什么情况下我会直接返回值。或者返回一个函数然后返回实际结果?
Q4。这对范围有何影响?闭包在这里有任何作用吗?
JSFiddle :http://jsfiddle.net/C7EDv/
答案 0 :(得分:3)
(Q1.1)右 - 两个args,一个带有过滤器名称的字符串......
(Q2 / 3)filter
(arg2)的第二个参数是构造函数(或“工厂”)函数。它仅在创建过滤器时执行一次。
构造函数必须返回一个函数。返回的函数将在使用与其关联的过滤器时执行。换句话说,返回的函数是注入(使用$ injector)到过滤器(http://docs.angularjs.org/api/ng。$ filterProvider)
我在下面添加了评论,详细说明了这一点:
angular.filter('reverse', function(service){
// This is run only once- upon creation
return function(str){
// This is run every time the filter is called
return str.split('').reverse().join('');
}
});
(Q3)您将始终使用此表单(“嵌套表单”),否则您将收到错误(Object ... has no method 'apply'
),因为Angular需要返回一个函数每当使用过滤器时,它都可以调用(使用apply()
)。这与Angular中的所有提供程序(包括服务)完全相同。
(Q2)如果可以做你所谓的“正常版本”,那么过滤器在创建时只运行一次。它获得的任何返回值都将用于过滤器的每次调用。由于具有始终返回相同值的过滤器通常不会有用,因此Angular会使用此javascript构造函数模式(您将在JS中的其他位置使用),以便每次使用过滤器都会导致对关联的新调用功能
(Q1.4)是的,返回的函数会反转字符串。这是一个关于这个过滤器的2分钟视频:http://www.thinkster.io/pick/EnA7rkqH82/angularjs-filters
(Q1.2 / 3)你的过滤器是否应该使用你在我上面使用service
的地方传递的任何服务(上面的链接有一个例子)。参数str
是您记录的过滤器的输入。
(Q4)“run one”区域确实创建了一个闭包 - 所以你可以像使用任何其他闭包那样使用它。