• $parse

    • 作用:将一个AngularJS表达式转换成一个函数
  • Usage
    $parse(expression)
    • arguments

      • expression:需要被编译的AngularJS语句
    • returnsfunc(context, locals)
      • context[object]:针对你要解析的语句,这个对象中含有你要解析的语句中的表达式(通常是一个scope object)
      • locals[object]: 关于context中变量的本地变量,对于覆盖context中的变量值很有用。
      • 返回的函数还有下面三个特性:
        • literal[boolean]:表达式的顶节点是否是一个javascript字面量
        • constant[boolean]:表达式是否全部是由javascript的常量字面量组成
        • assign[func(context, local)]:可以用来在给定的上下文中修改表达式的值

尝试应用这个服务

T1:在第一个例子中,我们先解析一个简单的表达式:(注:应为代码是在jsfiddle上写的所以大家实践的时候要注意引入angular.js文件)
代码如下:
(html)

<div ng-app="MyApp">
<div ng-controller="MyController">
<h1>{{ParsedValue}}</h1>
</div>
</div>

(js)

angular.module("MyApp",[])
.controller("MyController", function($scope, $parse){
var context = {
name: "dreamapple"
};
// 因为这个解析的语句中含有我们想要解析的表达式,
// 所以要把不相关的用引号引起来,整体然后用+连接
var expression = "'Hello ' + name";
var parseFunc = $parse(expression);
$scope.ParsedValue = parseFunc(context);
});

expression:是我们想要解析的表达式
context:就是一个解析表达的上下文环境(个人理解)
parseFunc:就是解析以后返回的函数
我们还可以通过控制台来看看返还的函数的属性:

angular.module("MyApp",[])
.controller("MyController", function($scope, $parse){
var context = {
name: "dreamapple"
};
// 因为这个解析的语句中含有我们想要解析的表达式,
// 所以要把不相关的用引号引起来,整体然后用+连接
var expression = "'Hello ' + name";
var parseFunc = $parse(expression); //false
console.log(parseFunc.literal);
//false
console.log(parseFunc.constant);
//undefined
console.log(parseFunc.assign);
//hello
console.log(parseFunc());
//function (self, locals) {
// return fn(self, locals, left, right);
// }
console.log(parseFunc); $scope.ParsedValue = parseFunc(context);
});

从控制台我们可以知道,返还的parseFunc是一个函数,其中它的literal和constant属性都是false,而且parseFunc()返回的是没有加入函数运行上下文的值即"Hello"。
T1-jsfiddle代码点击预览
T2:在第二个例子中,我们来再次使用$parse服务,来解析一个输入框中的值:
(html)

<div ng-app="MyApp">
<div ng-controller="MyController">
<input type="text" ng-model="expression" />
<div>{{ParsedValue}}</div>
</div>
</div>

(js)

angular.module("MyApp",[])
.controller("MyController", function($scope, $parse){
$scope.$watch("expression", function(newValue, oldValue, context){
if(newValue !== oldValue){
var parseFunc = $parse(newValue);
$scope.ParsedValue = parseFunc(context);
}
});
});

我们使用$watch监测input输入框的变化,每当输入框中的表达式的值发生变化时,我们都会解析它,我们可以尝试向输入框中输入"1+1",然后就会看到下面显示2。
T2:jsfiddle代码点击预览
T3:我们会在第三个实例中比较深入地使用$parse服务
(html)

<div ng-app="MyApp">
<div ng-controller="MyController">
<div>{{ParsedValue}}</div>
</div>
</div>

(js)

angular.module("MyApp",[])
.controller("MyController", function($scope, $parse){
$scope.context = {
add: function(a, b){return a + b;},
mul: function(a, b){return a * b}
}
$scope.expression = "mul(a, add(b, c))";
$scope.data = {
a: 3,
b: 6,
c: 9
};
var parseFunc = $parse($scope.expression);
$scope.ParsedValue = parseFunc($scope.context, $scope.data);
});

我们可以看到结果是45,我们大致可以这样理解,$parse服务根据$scope.context中提供的上下文解析$scope.expression语句,然后使用$scope.data数据填充表达式中的变量注意,如果把$scope.expression中的c换成4,那么结果就是30,所以得到45结果。

T3-jsfiddle代码

最新文章

  1. 在.Net中实现自己的简易AOP
  2. Oracle to_char 转换数值
  3. eclipse tomcat maven热部署
  4. 2.7 编程之美--最大公约数的3种解法[efficient method to solve gcd problem]
  5. The Cow Lexicon
  6. Android 通过代码设置radiobutton不同方位图标的两种方法
  7. 【数学】Codeforces 707C Pythagorean Triples
  8. c++转换构造函数和类型转换函数
  9. xib添加手势后报错:-[UITapGestureRecognizer setFrame:]: unrecognized selector sent to instance xxx
  10. Linux进程实时监控 - htop
  11. Spring源码解析——如何阅读源码(转)
  12. 什么样的PPT能助你成为一个优秀的演讲者——程序员的演讲之道
  13. springmvc的前端控制器
  14. 【转】vs2017快捷键大全
  15. Eclipse导入工程后出现中文乱码
  16. PID控制器开发笔记之十一:专家PID控制器的实现
  17. Chrome 浏览器数据无法同步,google账号登录失败,提示 Request canceled
  18. Node项目的Restful化
  19. XSS理解与防御
  20. 阿里云配置ssh

热门文章

  1. JavaScript程序员必备的5个debug技巧
  2. 适配高分辨率的图片High DPI Images for Variable Pixel Densities
  3. UIScrollView 几乎所有的属性和方法
  4. JAVA Selenium PHONCOMJS 获取js动态生成完整网页
  5. 用IIS防止mdb数据库被下载
  6. webshell三剑客[aspxspy、phpspy、jspspy]
  7. Linux中的In命令
  8. 阿里云 Ubuntu 14.04 安装mysql 5.6
  9. Microsoft Office Word 2007 文档结构图突然变小的解决办法
  10. (剑指Offer)面试题56:链表中环的入口结点