$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教程之四

    相信不少想学习linux的新手们正愁不知道看什么linux学习教程好,下面小编给大家收集和整理了几点比较重要的教程,供大家学习,如需想学习更多的话,可到wdlinux学堂寻找更多教程.   linux ...

  2. Manor

    Description Bob有n个正整数,他将这n个整数根据大小划分成两部分.对于小于等于k的整数放在集合A中,其余的放在集合B中.每次他从集合B中取出一个最大的值,将其变成0放入A集合中.然后将A ...

  3. AES的S-BOX构造

    利用GF(2^8)乘法逆元,以及矩阵运算,可以构造出AES的SBOX. 求乘法逆元的一般方法是利用扩展欧几里得定理,在这里我取了个巧. 因为我已经有了GF的指数表(见上一篇文),利用指数表可以轻易地构 ...

  4. 动态sql语句

    当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是执行搜索查询的SQL语句.对于搜索,可能要根据搜索条件判断来动态执行SQL语句. 在S ...

  5. RequireJS进阶(二)

    这一篇来认识下打包工具的paths参数,在入门一中就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”,但文件 ...

  6. MYSQL存储过程,清除指前缀的定表名的数据

    MYSQL存储过程,清除指前缀的定表名的数据 DELIMITER $$ DROP PROCEDURE IF EXISTS `drop_table`$$ ),)) BEGIN ) DEFAULT NUL ...

  7. PHP的输出缓冲区

    什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调 ...

  8. CMA连续物理内存用户空间映射---(一)

    背景: 在多媒体和图像处理等应用中,经经常使用到大块内存,尤其是硬件编解码.须要内核分配大块的物理连续内存. 这里希望通过把从内核分配的连续物理内存映射到用户空间.在用户空间经过处理,又能够入队到驱动 ...

  9. Linux常用命令之 查找命令 find(一)

    我们都知道在Linux中有着上千条的命令,而常用命令不过百条. 我们也知道在Linux里面“一切皆文件”,那么如何能够快速的找到你想要找的东西就显得尤为重要. find是Linux里面最重要的命令之一 ...

  10. ubuntu14.04 install flow.

    打开虚拟机,点击菜单上的“文件”,选择新建虚拟机,如下图所示: 注释:这里选择自定义安装,点击下一步. 这里我的虚拟机版本最新是10的,就选最新的,然后点击下一步,如下图: 这里选择要安装的Ubunt ...