$parse , $interpolate ,$complie , $destroy
$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多一次.
随机推荐
- vector,list和deque区别
stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...
- iOS 9之应用内搜索(CoreSpotlight)API
金田(github 示例源码) 前言 在iOS9之前我们只能使用Spotlight来搜索应用名称来打开指定App,而其他的内容都是提供给系统使用(信息,联系人,邮件等).在iOS9以后Apple允许开 ...
- HDU_2044——蜜蜂走蜂房,递推
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的 ...
- JavaScript IDE 大盘点,让选择不再难
文章来源:http://gcdn.gcpowertools.com.cn/showtopic-24110-1-3.html 阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最 ...
- 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...
- 基于Hadoop集群的HBase集群的配置
一 Hadoop集群部署 hadoop配置 二 Zookeeper集群部署 zookeeper配置 三 Hbase集群部署 1.配置hbase-env.sh HBASE_MANAGES_ZK:用来 ...
- vim的基本使用方法
头记:vim作为被大多数程序员所推崇的编辑器,是源于它的自由灵活以及令人舒服的输入模式,但对于新手来说无疑是个噩梦(需要记太多的命令), 而作为使用了vim有一段时间的我来说,总结下常用的命令,以备新 ...
- 小学生之KTV播放原理
第一步: 创建一个Song类 //歌曲名称 public string SongName { get; set; } //歌曲路劲 public string SongPath { get; set ...
- jQuery下的显示和隐藏
因为太久没更新了,所以来放一点没意思的内容. 做的是jQuery框架的隐藏和显示,HTML如下: <ul> <li>1</li> <li>2</l ...
- 查询矩形范围内的"点"要素
步骤 1,首先在含有主视图控件 ESRI.ArcGIS.Controls.AxMapControl mapCtrl_main 的主类中定义一个 IEnvelope 成员变量,用于记录鼠标在主视图控件画 ...