Javascript “隔离范围”=&引用;绑定和点符号AngularJS

Javascript “隔离范围”=&引用;绑定和点符号AngularJS,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,如何在带点符号的隔离作用域中创建具有嵌套属性的双向绑定。我以为'myObject.data':“=data”可以工作,但实际上不行。我不想链接myObject对象中的所有内容。我知道我可以做一些手表,但是'myObject.data'看起来更干净 .directive("myDirective", [function() { return { restrict: "E", scope: { 'myObject.data': "=da

如何在带点符号的隔离作用域中创建具有嵌套属性的双向绑定。我以为
'myObject.data':“=data”
可以工作,但实际上不行。我不想链接
myObject
对象中的所有内容。我知道我可以做一些手表,但是
'myObject.data'
看起来更干净

.directive("myDirective", [function() {
    return {
        restrict: "E",
        scope: {
            'myObject.data': "=data"
        },
        link: function (scope, element, attrs) {

            scope.myObject = {
                 data: "myValue"
            };
        }
     };
 }])

隔离作用域通常仅对模板有用,不应将其用作声明如何解释指令属性的方法。这是因为大多数没有模板的指令通常需要其环境的子范围或直接范围的语义

在您的例子中,您甚至可能不需要$watch,因为对象引用是支持双向数据绑定的,但是如果没有完整的代码,我无法确定

如果您想知道隔离范围语义到正常范围语义的转换:

@name -> attrs.name
=name -> $scope.$eval(attrs.name);
&name -> function() { return $scope.$eval(attrs.name); } 
编辑2:

在你的评论之后,我想到了这个。要保留双向数据绑定,必须在ng模型声明中使用“.”。这是因为双向数据绑定不适用于值类型,因为它们是不可变的。例如,您不能更改100的值。您需要传递一个引用类型对象,并挂起正在更改的值。基于双向数据绑定可以实现的原则,在隔离范围定义中指定值的完整路径是不可能的

Javascript:

angular.module('plunker', [])

.directive('twoWay', function() {
  return {
    restrict: 'E',
    template: '<div><input ng-model="thing.name" type="text" /></div>',
    scope: {
      thing: "="
    }, 
    link: function(scope, element, attrs) {
    }
  };
})

.controller('MainCtrl', function($scope) {
  $scope.data = {
    name: "World"
  };
});
angular.module('plunker',[])
.directive('twoWay',function(){
返回{
限制:'E',
模板:“”,
范围:{
事情:“=”
}, 
链接:函数(范围、元素、属性){
}
};
})
.controller('MainCtrl',函数($scope){
$scope.data={
名称:“世界”
};
});
HTML:


你好{{data.name}}


我在这些情况下使用的方法如下:

.directive("myDirective", [function() {
    return {
        restrict: "E",
        scope: {
            data: "="
        },
        controller: function($scope){
           $scope.dot = $scope //<--- here is the trick
        } 
     };
 }])
.directive(“myDirective”,[function(){
返回{
限制:“E”,
范围:{
数据:“=”
},
控制器:功能($scope){

$scope.dot=$scope//该指令有一个带有输入元素的模板。。如果该输入元素的模型使用虚线表示法,您将如何创建与父作用域的双向绑定。我需要在指令上保留隔离作用域。@user1273184您的注释没有解释为什么需要隔离作用域。您应该将e template和您的方法背后的推理。@user1273184我已经补充说明了为什么您声明隔离作用域的方法不起作用。该指令中有很多代码。它只会把事情弄得一团糟。我真的对在声明隔离作用域时使用点表示法感兴趣类似这样的
'myObject.data':“=data”
。但这不起作用。“myObject”有许多其他属性不需要向父作用域公开。我只想公开myObject.data。我知道我可以解决这个问题,但如果我能按照我所描述的方式来做,它看起来会更干净。@user1273184如果
myObject.data
是一种值类型,那么就不可能用angular.Yo实现您想要的功能您必须在模板ng模型声明中使用额外的“.”。
.directive("myDirective", [function() {
    return {
        restrict: "E",
        scope: {
            data: "="
        },
        controller: function($scope){
           $scope.dot = $scope //<--- here is the trick
        } 
     };
 }])