2016-03-14 53 views
1

这里是我的指令代码的正常工作:角指令与范围:@不工作

.directive('myGrid',function(){ 
return { 
    restrict:'E', 
    scope:{ 
    info:'=info' 
    }, 
    templateUrl : '/directiveGrid.html' 
} 

})

这里是一个codepen demo

但是,如果我改变的范围,如:

.directive('myGrid',function(){ 
    return { 
     restrict:'E', 
     scope:{ 
     info:'@info' 
     }, 
     templateUrl : '/directiveGrid.html' 
    } 
    }) 

它不起作用。这里是第二demo

+3

'='提供双向绑定,'@'只传递字符串值。他们是不同的。 – yukuan

回答

0

问题是,当你使用@用于隔离范围结合,它通过从属性值来指令。基本上在通过价值使用@stringify那价值,并在它传递给指令之前。因此,指向的值不是JSON格式,它在达到指令之前被串化(数据类型更改为string)。

如果你做{{info}}你会看到结果(这只是string)。它已被转换为字符串,这就是为什么你不能看到NG-repear工作

首选的方法是使用=,会做两件事情

  1. 双向绑定
  2. 它保留数据类型值传递给指令时的值。
0

这里有一些解释:

@结合本地/指令scope属性的DOM属性的评估值。由于属性值总是字符串,因此在使用@时,您将始终最终在该指令的作用域中为该属性创建一个字符串值。

@允许在指令属性上定义的值传递给指令的隔离范围。

=将本地/指令范围属性绑定到父范围属性。因此,对于=,您使用父级模型/范围属性名称作为DOM属性的值。您不能使用带有=的{{}}。

=在指令的隔离范围和父范围之间建立一个双向绑定表达式。子范围的变化并传播给父母,反之亦然。将=想象成@和&的组合。 Screencast on =是:https://egghead.io/lessons/angularjs-isolate-scope-two-way-binding

是的,双向绑定(=)允许本地/指导范围和父范围共享数据。 “表达式绑定”允许指令调用由DOM属性定义的表达式(或函数) - 您也可以将数据作为参数传递给表达式或函数。因此,如果您不需要与父级共享数据 - 您只需要调用父范围中定义的函数 - 则可以使用&语法。

感谢&干杯