如何在 Angular 指令中的模板上呈现范围变量
How to render scope variable on template in Angular directive
[更新] 事实证明,如果我使用"@"作为范围变量,它将在渲染模板时以异步方式使用(我仍然无法弄清楚为什么以及如何),顺序将是compre ->控制器->pre ->post ->observe,奇怪的是直到POST阶段,scope.data仍然是对象,但是在观察内部,它突然变成了字符串, 任何人都可以给我一些关于为什么会发生这种情况的帮助(例如当模板将数据绑定到它时)?
var app = angular.module("vp", []);
app
.controller("main", function($scope){
$scope.data = ["1", "2"];
})
.directive("chartBuilder", function(){
return {
restrict: "AE",
scope: {
data: "@data"
},
controller: function($scope){
console.log($scope.data);
$scope.data = JSON.parse($scope.data);
},
template: '<div><input ng-repeat="d in data track by $index" ng-model="data[$index]" /></div>',
compile: function(EL, attrs){
console.log(EL);
return {
pre: function(scope, EL, attrs){
console.log(scope.data);
},
post: function(scope, EL, attrs){
// link: function(scope, EL, attrs){
console.log(scope.data);
attrs.$observe("data", function(d){
console.log(d);
scope.data = JSON.parse(scope.data);
console.log(d);
})
}
}
}
};
});
都:
我对 Angular 指令很陌生,假设我有一个接受来自父范围的 attr 的指令:
<html ng-app="vp">
<head>
<title></title>
</head>
<body ng-controller="main">
<input ng-repeat="d in data track by $index" ng-model="data[$index]" />
<chart-builder data={{data}}></chart-builder>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script type="text/javascript">
var app = angular.module("vp", []);
app
.controller("main", function($scope){
$scope.data = ["1", "2"];
})
.directive("chartBuilder", function(){
return {
restrict: "AE",
scope: {
data: "@"
},
controller: function($scope){
$scope.data = JSON.parse($scope.data);
},
template: '<div><input ng-repeat="d in data track by $index" ng-model="data[$index]" /></div>',
link: function(scope, EL, attrs){
}
};
});
</script>
</body>
</html>
请注意,我在指令中使用了"@",原因是我想设置如下逻辑:
父作用域可以影响指令中的值,但在指令中,只允许从父作用域复制数据,并且其中的任何更改都不能反映到父作用域。
例如,init 父范围数据是 [1,2],因此指令会将其作为字符串(因为 @)获取,并在控制器中将其转换为对象,然后在模板上呈现。
但问题是:
指令中的数据在模板上呈现时仍然是字符串,我想知道为什么 JSON.parse 不起作用(在指令的控制器中,它确实有效,但是当绑定到模板时,它仍然是字符串)
谢谢
传入数组引用要简单得多:
<chart-builder data="data"></chart-builder>
.JS
app
.controller("main", function($scope){
$scope.data = ["1", "2"];
})
.directive("chartBuilder", function(){
return {
restrict: "AE",
scope: {
data: "="
},
controller: function($scope){
console.log($scope.data)// array not string ["1", "2"]
},
template: '...',
link: function(scope, EL, attrs){
}
};
});
相关文章:
- js命名空间和变量范围
- 如何确保变量范围在这个循环中得到维护
- 在两个浏览器选项卡之间共享变量范围
- 文件API中的Javascript变量范围
- javascript和jQuery的嵌套对象函数中的变量范围
- JavaScript 函数变量范围问题
- JavaScript 中变量范围的问题
- Javascript - 揭示对象和变量范围
- 主干.js(具有 Require.js)变量/范围访问问题
- Javascript 变量范围未定义
- 如何绕过javascript变量范围
- IE 8变量范围错误
- 了解 Javascript 变量范围
- 控制变量范围
- 函数之间的Javascript变量范围问题
- 这种减少if语句中声明的变量范围的模式是一种好的做法吗
- 用于未初始化的局部变量的javascript变量范围
- 变量范围
- 请求节点模块变量范围
- Javascript 和 JQuery dom 全局变量范围