$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. delphi7编写客户端调用java服务器端webservice示例

    1. 首先取得java-webservice服务器端地址.我的是:http://localhost:8080/mywebservice/services/mywebservice?wsdl 2. 然后 ...

  2. HDOJ 1326 Box of Bricks(简单题)

    Problem Description Little Bob likes playing with his box of bricks. He puts the bricks one upon ano ...

  3. HDU_2553——n皇后问题,作弊

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放置方法.   Inp ...

  4. Java实现生命周期管理机制

    先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然 ...

  5. Storm流分组介绍

    Storm流分组介绍                流分组是拓扑定义的一部分,每个Bolt指定应该接收哪个流作为输入.流分组定义了流/元组如何在Bolt的任务之间进行分发.在设计拓扑的时候需要定义数据 ...

  6. 远程连接mysql

    win系统下,连接别人的mysql或者让别人链接自己的mysql: 打开命令行cmd 进入mysql: mysql -u root -p mysql>use mysql;  mysql>s ...

  7. 安装orcle10g oel5.6

    一.安装OEL 5.6 二.安装VMware Tools 1)  选择菜单里的VM选项,里面有一个子选项是installVMware Tools,选择它. 2)   回到操作系统,将光驱挂载到/mnt ...

  8. C# Tips:获得当前登录计算机的用户(本地用户/域用户)

    须要using的namespace: using System.Security.Principal; 获得登录计算机的用户: WindowsIdentity windowsIdentity = Wi ...

  9. ini文件解析c库(iniparser)

    一.交叉编译ini解析库 1.官方网站http://ndevilla.free.fr/iniparser 下载iniparser-3.1.tar.gz 2.解压 tar -zxvf iniparser ...

  10. 在VMware中为Linux系统安装VM-Tools的详解教程

    在安装Linux的虚拟机中,单击“虚拟机”菜单下的“安装Vmware-Tools”. 先介绍一下下面安装该工具时要用到的几个目录: /mnt 挂载目录,用来临时挂载别的文件系统,硬件设备 /tmp临时 ...