$parse典型的使用是放在設置字符串表達式映射在真實對象上的值。也可以從$parse上直接獲取到表達式對應的值。
var getter = $parse('user.name');
var setter = getter.assign;
setter(scope, 'new name');
getter(context, locals) // 傳入作用域,返回值
setter(scope,'new name') // 修改映射在scope上的屬性的值爲‘new value’
這裏是修改的是變量,其實在解析的時候還有可能是是函數比如
<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結果。
總之
$parse 返回一個函數,調用這個函數時,可以傳兩個參數,第一個作用域,第二個是變量集,後者常用於覆蓋前者的變量:
var get_name = $parse('name'); var r = get_name({name: 'xx'}, {name: 'abc'}); console.log(r);
$parse 返回的函數,也提供了相應的 assign 功能,可以爲表達式賦值(如果可以的話):
var get_name = $parse('name'); var set_name = get_name.assign; var r = get_name({name: 'xx'}, {name: 'abc'}); console.log(r); var s = {} set_name(s, '123'); var r = get_name(s); console.log(r);