Angularjs 通过指令中的属性传递数据以在编译阶段访问它?

Angularjs 通过指令中的属性传递数据以在编译阶段访问它?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,在编译阶段是否有方法访问指令中的对象。因为编译阶段不提供范围。而attrs.data将返回一个字符串,因此什么是获取数据的最佳方式 ** 让little hack编译,这样我们就可以访问范围 angular.module('app',[]) .controller('app',函数($scope){ 此参数。数据={ 项目:[{ id:1, 姓名:“第一” }, { id:2, 姓名:“第二” }, { id:3, 姓名:“第三” }] } }) .directive('dir',functi

在编译阶段是否有方法访问指令中的对象。因为编译阶段不提供范围。而attrs.data将返回一个字符串,因此什么是获取数据的最佳方式

**


让little hack
编译
,这样我们就可以访问
范围

angular.module('app',[])
.controller('app',函数($scope){
此参数。数据={
项目:[{
id:1,
姓名:“第一”
}, {
id:2,
姓名:“第二”
}, {
id:3,
姓名:“第三”
}]
}
})
.directive('dir',function(){
返回{
替换:正确,
限制:“A”,
范围:{
数据:'='
},
编译:函数(元素){
setTimeout(函数(){
警报(JSON.stringify(element.scope().ctrl.data))
}, 1)
}
}
})
angular.bootstrap(document.body,['app'])

隔离作用域是从父作用域绑定数据的好模式

<div dir data="data.items">
也可以使用单向绑定

<div dir data="{{data.items}}">

也不会有帮助,因为
attrs
中的属性没有在
compile
函数中插值。它不这样工作是有原因的:
MainCtrl
在指令的
compile

之后运行,将渲染过程划分为编译和链接阶段是角度框架的基石。这种构造意味着您有机会在模板在链接阶段被范围数据“实例化”之前对其进行修改

指令的编译回调只运行一次,而链接回调可以在不同范围内运行任意次数

因此,如果要传递给angular的模板取决于应用程序中的某些数据,该怎么办?一旦您的指令注册到angular,它的模板是不可变的

我们不能使用作用域,所以我要做的是拥有一个javascript对象——让我们称之为注册表——它位于angular上下文之外。然后,我将需要从编译阶段访问的数据放入注册表,并通过模板中的属性将键传递到编译阶段,您在编译阶段确实可以访问这些属性


使用此方法时,需要注意不要泄漏内存。可能是通过使用$destroy回调来清除相应的注册表项。

编译回调返回的pre和post属性构成了链接阶段,因此在编译阶段没有范围访问。更改为使用setTimeout只会将范围访问延迟到编译阶段之后,所以再次-编译阶段没有范围访问:)此外,使用element.scope()意味着您的指令仅在angular在调试模式下运行时才起作用。
<div dir data="data.items">
angular.module('app').directive('dir', function() {
  return {
    scope: {
      data: '='
    },
    ...
  }
})
<div dir data="{{data.items}}">
<div dir data="{{data.items}}">