比分直播500


比分直播500爷爷,成了我儿时的榜样。
比分直播500不过,他似乎没想过,万一高进没打算接受他的条件,那又怎么办?当然会有办法的。比分直播500参观一座阴森的古堡时,一位女士悄悄告诉导游,她很怕鬼,害怕在参观时会碰上一个。   为了安慰她,导游对她说,他在这里工作这么多年,从来也没见过一个鬼。   “你在这里工作多久了?”女士问。   “三百年。”比分直播500一生岁月怎会等?望着那归程。
比分直播500舞动身姿漫天飞舞。
比分直播500旧城草木深,幽梦无人解。兜兜转转迷了路,一回首,身边已是别样风景,我们再也不是彼此故事里的那个人。清风带走了所有的答案,收藏在岁月的底片上,
比分直播500一天,老师带小朋友去远足。   老师说:“小朋友们,你们都去采生果,30分钟后归来,好吗?”   30分钟后,老师问小朋友采到什么:“小红,你采到什么?”   “我在洗苹果,由于我采到苹果。”   “小美呢?” “我在洗番茄,由于我采到番茄。”   “阿明呢?” “我在洗布鞋,由于我踩到大便!”比分直播500本来郝仁的双手可以在对方一个一个抚摸起来,不过他并没有这样做,生怕对方吃醋或是什么。对于下面的老二一柱朝天嘛,郝仁只是不断用冷水在冲它,希望它!比分直播500我才不是你呢!虹虹面露羞涩之意,作势要打:不过,爸爸妈妈都想我交男朋友,还介绍了很多公子哥给我认识。比分直播500轻轻的将一杯茶,放到唇边,介是,香味就萦绕在唇齿间,心安静如秋波,静谧而安详。
比分直播500可易飞实在看不过彭枫这家伙毁掉孩子的前途,惟有亲自收了那孩子,让彭枫平时教一下。比分直播500无论是金融风暴里的表现,还是其他时候的表现,总是显得如此。比分直播5002015.3.30晚七点
比分直播500现在在家里。

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 足彩预测模型帝豪娱乐澳门葡京网址易胜博澳门百家乐赌场网上足球外围投注澳门新葡京娱乐场注册送钱e8889.com澳门赌场澳门博彩乐橙娱乐注册送钱e8889.com全讯博彩论坛去澳门国际澳门赌场代理久乐国际娱乐

angular源码分析:compile服务directive他妈

一、directive的注册

1.我们知道,我们可以通过类似下面的代码定义一个指令(directive)。

var myModule = angular.module(...);

  myModule.directive('directiveName', function factory(injectables) {
    var directiveDefinitionObject = {
      priority: 0,
      template: '<div></div>', // or // function(tElement, tAttrs) { ... },
      // or
      // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
      transclude: false,
      restrict: 'A',
      scope: false,
      controller: function(scope, element, attrs, transclude, otherInjectables) { ... },
      controllerAs: 'stringAlias',
      require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],
      compile: function compile(tElement, tAttrs, transclude) {
        return {
          pre: function preLink(scope, iElement, iAttrs, controller) { ... },
          post: function postLink(scope, iElement, iAttrs, controller) { ... }
        }
        // or
        // return function postLink( ... ) { ... }
      },
      // or
      // link: {
      //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },
      //  post: function postLink(scope, iElement, iAttrs, controller) { ... }
      // }
      // or
      // link: function postLink( ... ) { ... }
    };
    return directiveDefinitionObject;
  });

通过前面的分析(directive: invokeLater('compileProvider', 'directive')),我们可以知道上面的代码会最终调用compileProvider.directive

2.compileProvider.directive


  var hasDirectives = {},//定义用于存储指令的对象
      Suffix = 'Directive',
      COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)/,
      CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/,
      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),
      REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/;
  /**
   * @ngdoc method
   * @name compileProvider#directive
   * @kind function
   *
   * @description
   * Register a new directive with the compiler.
   *
   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which
   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the
   *    names and the values are the factories.
   * @param {Function|Array} directiveFactory An injectable directive factory function. See
   *    {@link guide/directive} for more info.
   * @returns {ng.compileProvider} Self for chaining.
   */
   this.directive = function registerDirective(name, directiveFactory) {
    assertNotHasOwnProperty(name, 'directive');
    if (isString(name)) {
      assertValidDirectiveName(name);
      assertArg(directiveFactory, 'directiveFactory');
      if (!hasDirectives.hasOwnProperty(name)) {
        hasDirectives[name] = [];
        provide.factory(name + Suffix, ['injector', 'exceptionHandler',//这里在定义指令的服务,比如注册了`test`这样的一个指令,这里就会定义个`testDirective`的服务.
          function(injector, exceptionHandler) {//注意这个匿名函数,将在需要获取指令的是否被执行,所以当这个函数执行时,所有的指令的定义都放入了hasDirectives数组
            var directives = [];
            forEach(hasDirectives[name], function(directiveFactory, index) {//注意这里的directiveFactory是从数组中取出的元素而不是前面函数的参数
              try {
                var directive = injector.invoke(directiveFactory);
                if (isFunction(directive)) {
                  directive = { compile: valueFn(directive) };
                } else if (!directive.compile && directive.link) {
                  directive.compile = valueFn(directive.link);
                }
                directive.priority = directive.priority || 0;
                directive.index = index;
                directive.name = directive.name || name;
                directive.require = directive.require || (directive.controller && directive.name);
                directive.restrict = directive.restrict || 'EA';
                var bindings = directive.bindings =
                    parseDirectiveBindings(directive, directive.name);//这个parseDirectiveBindings需要分析
                if (isObject(bindings.isolateScope)) {
                  directive.isolateBindings = bindings.isolateScope;
                }
                directive.moduleName = directiveFactory.moduleName;
                directives.push(directive);
              } catch (e) {
                exceptionHandler(e);
              }
            });
            return directives;
          }]);
      }
      hasDirectives[name].push(directiveFactory);//这里可以看到指令可以同名,一个指令名对应的是一个指令数组
    } else {
      forEach(name, reverseParams(registerDirective));//可以数组的方式,成批量的注册指令
    }
    return this;
  };

请注意代码的执行数序。
a.在第一注册某个执行时(比如现在注册了两个test执行),那么第一次调用这个函数注册指令时,会定一个testDirective的服务,且将该指令的工厂函数压入hasDirectives['test']
b.当再次注册一个与test同名的另一个指令时,仅是将其工厂函数压入hasDirectives['test']
c.当指令需要时,框架会调用testDirectiveProvider.\(get(也就是testDirective的工厂方法)制造一个directives数组 ### 3.parseDirectiveBindings ```js function parseIsolateBindings(scope, directiveName, isController) { var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*\)/;

var bindings = {};

forEach(scope, function(definition, scopeName) {
  var match = definition.match(LOCAL_REGEXP);

  if (!match) {
    throw compileMinErr('iscp',
        "Invalid {3} for directive '{0}'." +
        " Definition: {... {1}: '{2}' ...}",
        directiveName, scopeName, definition,
        (isController ? "controller bindings definition" :
        "isolate scope definition"));
  }

  bindings[scopeName] = {
    mode: match[1][0],
    collection: match[2] === '*',
    optional: match[3] === '?',
    attrName: match[4] || scopeName
  };
});

return bindings;

}

function parseDirectiveBindings(directive, directiveName) {
var bindings = {
isolateScope: null,
bindToController: null
};
if (isObject(directive.scope)) {//指令对象中scope==true 或者 scope是一个对象时
if (directive.bindToController === true) {
bindings.bindToController = parseIsolateBindings(directive.scope, //解析scope对象中的表达式
directiveName, true);
bindings.isolateScope = {};
} else {
bindings.isolateScope = parseIsolateBindings(directive.scope,
directiveName, false);
}
}
if (isObject(directive.bindToController)) {
bindings.bindToController =
parseIsolateBindings(directive.bindToController, directiveName, true);
}
if (isObject(bindings.bindToController)) {
var controller = directive.controller;
var controllerAs = directive.controllerAs;
if (!controller) {
// There is no controller, there may or may not be a controllerAs property
throw compileMinErr('noctrl',
"Cannot bind to controller without directive '{0}'s controller.",
directiveName);
} else if (!identifierForController(controller, controllerAs)) {
// There is a controller, but no identifier or controllerAs property
throw compileMinErr('noident',
"Cannot bind to controller without identifier for directive '{0}'.",
directiveName);
}
}
return bindings;
}

```

二、给出一幅图说明angular的"编译原理"


1.在定义或者注册指令,最终是以延迟调用\(compileProvider.Directive来完成 2.编译阶段,主要工作是收集dom元素上引用到的指令,编译函数将返回一个"链接函数"用户完成和\)scope的链接.
3.链接过程,将scope与dom建立联系,指令指令中定义的link函数

由于\(compile这部分的代码过于复杂,本期暂且讲到这里,下期继续** **[上一期:angular源码分析:angular中脏活累活的承担者之\)interpolate](http://www.cnblogs.com/web2-developer/p/angular-12.html)**
下一期:angular源码分析:compile服务指令的编写**

posted @ 2015-11-25 01:43 王大鹏 阅读(...) 评论(...) 编辑 收藏