AngularJs& Javascript嵌套函数&他们的调用

时间:2013-11-27 22:18:32

标签: javascript angularjs

考虑以下代码

<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过滤器。以下是我的想法:

  1. 用两个args调用angular.filter()arg1: strin g&amp; arg2: function(准确无名或无名称)
  2. arg2函数不接受参数,而是在其中嵌套另一个匿名函数。
  3. 这个嵌套的匿名函数确实采用单个参数 - 应用此过滤器的文本或字符串。
  4. 这个嵌套的匿名函数接受字符串,将其反转。
  5. 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/

1 个答案:

答案 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”区域确实创建了一个闭包 - 所以你可以像使用任何其他闭包那样使用它。