AngularJS - valueFn

Dra*_*anS 5 javascript oop angularjs

什么是功能

function valueFn(value) {return function() {return value;};}
Run Code Online (Sandbox Code Playgroud)

在angular.js中定义.

它用于前.在

var lowercaseFilter = valueFn(lowercase);
register('lowercase', lowercaseFilter);
Run Code Online (Sandbox Code Playgroud)

如果我们直接使用小写,那么会有什么不同

register('lowercase', lowercase);
Run Code Online (Sandbox Code Playgroud)

而不是前一行.

同样的方法,在方法中

function ngDirective(directive) {
  if (isFunction(directive)) {
    directive = {
      link: directive
    }
  }
  directive.restrict = directive.restrict || 'AC';
  return valueFn(directive);
}
Run Code Online (Sandbox Code Playgroud)

为什么最后一行不是

return directive;
Run Code Online (Sandbox Code Playgroud)

return valueFn(directive);
Run Code Online (Sandbox Code Playgroud)

pko*_*rce 12

过滤器(和一些其他服务)是常规函数,但AngularJS严重依赖于依赖注入,因此这些过滤器(函数)不会按原样(作为实例化对象)向客户端公开,而是由工厂函数创建.这样做是为了使AngularJS DI系统可以将依赖项注入工厂函数(稍后在闭包中可以使用这些依赖项).

但是有些情况下没有什么可注入的,整个工厂的功能工作归结为返回一个预先实例化的值.这是lowercaseFilter(和许多其他过滤器)的情况.因此,不是重复相同的,几乎不做任何工厂函数,而是 valueFn创建它以避免代码重复.没有它,AngularJS代码必须包含:

var lowercaseFilter = function(){
  return lowercase;
};
var uppercaseFilter = function(){
  return uppercase;
};
...
Run Code Online (Sandbox Code Playgroud)

写起来更简洁:

var lowercaseFilter = valueFn(lowercase);
var uppercaseFilter = valueFn(uppercase);
...
Run Code Online (Sandbox Code Playgroud)

简而言之 - 我怀疑原因是DRY.