2013-03-20 44 views
3

在查看有关指令中的隔离范围的AngularJS(及相关)文档和其他stackoverflow问题之后,我仍然有点困惑。为什么我不能在父范围和指令隔离范围之间进行双向绑定,其中父范围属性是对象而不是属性?我应该使用scope.$parent以外的所需房产吗?这似乎是错误的。在此先感谢您的帮助。如何从父范围继承复杂的属性到我的指令的隔离范围

相关小提琴是here

HTML:

<div ng-app="myApp"> 
    <div ng-controller="myCtrl"> 
     <div my-directive>{{test.name}}</div> 
    </div> 
</div> 

的JavaScript:

var myApp = angular.module('myApp', []); 

myApp.controller('myCtrl', function ($scope) { 
    $scope.test = {name:"name", value:"value"}; 
}); 

myApp.directive("myDirective", function() { 
    return { 
     replace: true, 
     restrict: 'A', 
     scope: {test: '='}, 
     template: '<div class="parent"><div>This is the parent Div.</div><div>Value={{test}}</div></div>', 
     link: function (scope, element, attrs) { 
      console.log("scope.test=["+scope.test +"]"); 
      console.log("scope.$parent.test=["+scope.$parent.test.name+"]"); 
     } 
    }; 
}); 

回答

9

对于使用分离范围的指令,属性用于指定父作用域属性的指令隔离子范围将需要访问。 '='提供双向绑定。 '@'提供“单向字符串”。 '&'提供单向表达式。

为了让你的指令(双向绑定)访问父范围对象属性test,使用HTML:

<div my-directive test="test"></div> 

这可能是更有益的使用不同的名称:

<div my-directive some-obj-prop="test"></div> 

然后在你的指令中:

scope: { localDirProp: '=someObjProp'}, 
template: '<div ...>Value={{localDirProp}}...', 

隔离范围不会从父范围原型继承,因此它无权访问任何父范围的属性(除非使用'@'或'='或'&')。使用$parent是仍然访问父范围的一种方式,但不是通过原型继承。 Angular在范围上创建了这个特殊的$parent属性。通常(即最佳实践),不应使用它。

+0

感谢马克!鉴于我试图绑定的属性是一个对象,使用HTML属性(只能是字符串)引用它并不直观。另外,由于我只是简单地将HTML用作我希望我的指令所在的位置的持有者,所以使用它来定义我希望在范围之间同步的属性似乎并不合理。无论如何,我想我现在明白了。我很感谢你的回答。虽然AngularJS文档有一些优点,但在解释开发人员制定代码决策所需的中级概念时,可以看到有待改进的余地。 – KSev 2013-03-21 16:21:20

+0

是的,我同意HTML属性的值是(范围)对象的名称是相当奇怪的。 – 2013-03-21 16:25:19

+4

对于那些可能会发现这个问题很有帮助的人来说,这里是更新的,工作小提琴与马克的建议实施:http://jsfiddle.net/ksevksev/PWdYZ/ – KSev 2013-03-21 16:30:41