2014-03-02 76 views
1

可能有人解释我或指向一个文档,它不会解释以下问题: 我无法在link函数中设置'@'映射属性指示。然而,'='映射的属性可以在指令的link函数中设置为特定值。 工作的例子可以发现 here in jsbin设置=和@属性在角度指令的链接功能

我指的是下面的代码:

directive('myDir', function() { 
    return { 
    scope: { 
     byValue: '@', 
     byRef: '='}, 
    template: '<span>byValue: {{byValue}}<br>byRef: {{byRef}}</span>', 
    link: function(scope) { 
     scope.byValue = 'Custom Value set for byValue'; //this call is ignored!!! 
     scope.byRef = 'Custom Value set for byRef'; 
    } 
    }; 

该指令将呈现:

 
byValue: myProp 
byRef: Custom Value set for byRef 

感谢,并有一个愉快的一天!

Gabriel

回答

0

将对象指定为范围属性会创建一个隔离范围。

@将本地/指令范围属性绑定到DOM属性的评估值。结果总是一个字符串,因为DOM属性是字符串。这种与评估的属性值(非属性)绑定的方式。

=将本地/指令范围属性绑定到父范围属性。这就像一个双向绑定。

例如,假设你写这样的HTML,

<tag test1="name"></tag> 

而且你有一个范围值

$scope.name = "MyName" 

在你做

scope: { 
    nameProp: '=test1', 
    nameAttr: '@test1' 
} 

一个指令,你会得到

nameProp = "MyName" 
nameAttr = "name" 

当你做到这一点

scope: 
{ 
    byValue: '@', 
    byRef: '=' 
} 

你可以访问家长作用域byRef酒店需要从指令中,反之亦然。这就是为什么你越来越

byRef: Custom Value set for byRef 

byValue情况下,指令$Scope.byValue填充了作用域byValue父的属性值,而你的情况,如果可能myProp

+0

感谢Muctadir的答案。我可以解决你的问题,但我仍然有问题。在我的例子中,我在'link'函数中设置了范围的'byValue'属性。因此,我期望在渲染视图中设置'link'函数中的值。不幸的是,渲染的视图显示了从外部作用域映射的值。看起来,这个角度在'link'函数调用之后设置了一个'@'映射属性的值。你能证实吗? – Gabriel