angular1.x 中重要指令介绍($eval,$parse和$compile)
这篇文章是我两年前在博客园写的,现在移植过来,不过Angular 1.x 在国内用的人已经不多了,希望能帮助到有需要的人 在 angular 的服务中,有一些服务你不得不去了解,因为他可以说是 ng 的核心,而今天,我要介绍的就是 ng 的两个核心服务, 大家可能会疑问, $eval: function(expr,locals) { return $parse(expr)(this,locals); } 相信看完源码大家就明白了吧,好了,现在就开始两种核心服务的讲解了,如果感觉我说的不对的话,欢迎在评论区或者私聊指出,免得祸害其他读者。 再讲这两个服务的时候,我要先讲一个在本贴的概念:上下文 我相信,很多人都听过这个“上下文”,但是可能有点模糊,在我这里给大家解释解释看看大家接不接受这个说法。 还记得 angular 的数据绑定吗?比如:我现在有个有个叫 TestCtrl 的控制器,他的内容如下: .controller('TestCtrl',function($scope) { $scope.test = "Boo!!!" }) 而在 html 中我们的代码是这样的 <body ng-controller="TestCtrl"> {{test}} </body> 那么,大家不用想都知道结果了,页面上肯定会显示 但是如果我删掉 ng-controller 的指令呢?也就是我没有在 html 申明控制器,你直接绑定{{test}}会如何呢? 结果只有一个,那就是页面啥都没有(ps:因为你申明了 ng-app)。讲到这里大家明白了吗? 控制器就相当于一个上下文的容器,真正的上下文其实是 好了,上下文的概念已经讲完了,其实挺容易理解的,基本上和 那么言归正传,我们开始讲 var getter = $parse('user.name'); var setter = getter.assign; var context = {user:{name:'angular'}}; var locals = {user:{name:'local'}}; expect(getter(context)).toEqual('angular'); setter(context,'newValue'); expect(context.user.name).toEqual('newValue'); expect(getter(context,locals)).toEqual('local'); 大家看到的是 ng 文档里面对于$parse 服务性价比最高的几行代码,
大家看到的下面四个语句最终都能通过测试,现在我们一个个来分析,分析之前我要解释一遍什么叫
所以我们看到第一行测试代码是这样的: getter(context)).toEqual('angular') //实际上就是 $parse('user.name')(context) 在这个 context 就是上下文,他能返回“angular“这个字符串的原理就是经过这三步的:
所以这句测试代码是成功的。 我们看第二个方法 setter 方法 setter(context,'newValue'); //实际上就是 $parse('user.name').assign(context,'newValue') expect(context.user.name).toEqual('newValue'); //测试数据上下文的值是否被改变 这里的 setter 方法其实是改变值得方法
于是上下文对象发生了改变,重新用 getter 方法去获取表达式的时候,上下文已经从 expect(getter(context,locals)).toEqual('local');//实际上就是$parse('user.name')(context,locals) 这里要表现的其实是上下文的替换功能。 在 getter 的方法中我们不仅可以选择第一个上下文,但是如果我们传递了第二个参数,那么第一个上下文就会被第二个上下文覆盖,注意是覆盖.
重新回到 在这里 如果你了解了 比如你有一段 html 代码
但是在指令中,她会返回两个函数 第一个执行的是 pre-link,它对于同一个指令的遍历顺序是从父节点到子节点的遍历,在这个阶段,dom 节点还没有稳定下来,无法做一些绑定事件的操作,但是我们可以在这里进行一些初始化数据的处理。 第二个执行的是 post-link,也就是我们常说的 link 函数,他是从子节点到父节点遍历的,在这个阶段,DOM 节点已经稳定下来了,我们一般会在这里进行很多的操作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |