$parse 是angular 提供的javascript解析器 .

var getter = $parse(expression);

var setter = getter.assign;

                    controller("ctrl", ["$scope", "$parse", "$compile", "$interpolate", function ($scope, $parse, $compile, $interpolate) {
//read
$scope.name = "hello";
var expression = "name + ' ' +((5+6) == (12-1))";
var getter = $parse(expression);
var value = getter($scope); //hello true
//write
expression = "name";
              var setter = getter.assign;
  setter($scope, "1782");
$scope.name; //1782
}]);

有点像javascript eval 和 with 的结合。内部是通过复杂的正则实现的。

$parse 无法解析angular 的 {{}} 符合。

所以当我们需要解析如 {{name}} 时, 我们会用 $interpolate

                        $scope.name = "hello";
var expression = "{{name}}";
var value = $interpolate(expression)($scope); //没有setter的方法哦
console.log(value);

$compile 是用来处理html 节点的 . 要注意的是 $compile('str')($scope) = node; 这个node要在digest之后才会有scope value, ng-repeat同理,没有digest连一行都看不见,只有comment记号。

                        $scope.name = "hello"
var link = $compile("<div>{{name}}</div>");
var node = link($scope);
console.log(node[0].innerHTML); //{{name}} <--还没同步值
setTimeout(function () {
console.log(node[0].innerHTML); //hello <--同步咯
}, 0); //推迟到$digest之后

$compile 要注意的事 :

var elemA = $compile(directiveA)(scopeA);

1.elemA 的 scope 一定是scopeA , 即使directiveA使用了隔离scope.(elemA的child才是隔离的scope)

2.如果 directiveA 内有require, 那是不对的,会报错, 指令有require 那么它必须和它的依赖指令一起compile

3.$compile 不依赖elem的格局, 它只在乎scope, 所以elemA 你可以append到任意的地方,scope改变view依然会改变

4.scope 属于模板,所以你compile的这个scope应该是只属于这个模板的,当模板被remove,你的scope理应一同被remove.

5.template 不能被 compile 超过一次,同理 scope 也是一样 (不要想着一个scope compile 多个模板 , 记得 scope 属于模板而不是控制器 !)

6.remove 或 html('') 删除模板时, 记得调用 $elem.scope().$destroy(); scope一样删除.

7. 一般上只有在做动态模板的时候我们才会自己调用 $compile, 大部分情况下我们还是简单实用指令,模板,控制器就好 ^^

其实在angualr中最好是用 $timeout(fn,time,need_digest). 第3个参数让我们觉得之后要不要digest多一次.

随机推荐

  1. 神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?

    中国航天用的SpaceOS主要内容是仿造美国风河系统公司的VxWorks653(653是产品名,并非版本号). 先解释为什么用这个系统不用Linux: 航天器的内存和CPU都非常弱,弱到什么程度呢:天 ...

  2. 2014-07-23 .NET实现微信公众号接入

    今天是在吾索实习的第11天.今天我跟我的实习小组的组员们,解决了关于使用ASP.NET进行微信公众号接入的问题.因为我们小组成员也是刚接触微信公众号的二次开发,所以在解决该问题的工程中也走了不少弯路. ...

  3. 为兴趣求职:如何学习UI框架,请将你的看法观点写在评论下面

    前言:此篇文章是就我女朋友的求职和前端学习经历而写,希望得到UI前辈的热心指点,不胜感激涕零! 地理坐标: 中国,四川,成都 求职经历: 她之前找过两份工作,第一份是金融销售专员,第二份是汽车保险.她 ...

  4. Linux命令之exit

    本文链接:http://codingstandards.iteye.com/blog/836625   (转载请注明出处) 用途说明 exit命令用于退出当前shell,在shell脚本中可以终止当前 ...

  5. [转]Android 网络通信框架Volley简介(Google IO 2013)

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  6. 关于js中 document.body.scrollTop 不能返回正确值的原因

    本来是为了通过document.body.scrollTop来获取浏览器垂直滚动条向下滚动的像素,但是不管滚动条在什么位置总是返回是0,造成这样的原因和html的头部声明有关,如果头部声明 为:< ...

  7. SplitButton( 分割按钮)

    一. 加载方式//class 加载方式<a href="javascript:void(0)" id="edit" class="easyui- ...

  8. 2、第2节课html教程客户端控件/css第一课/20150917

    1.<form> 标签 提交 <form action="http://www.baidu.com" method="post'> </fo ...

  9. ArcGIS Server Manager登陆不了

    我很是郁闷,安装都好了(post安装完成之后它要我将 相关的用户(我在这里安装的时候已指定) 添加到 agsadmin和agsusers两个用户组中.都做好了, 我甚至将刚刚的用户和用户组都删掉,重新 ...

  10. sealed 密封类,不能被其他类继承,但可以继承其他类

    public sealed class Person:继承类名 { }