Javascript 角度指令单向绑定控制器中的更改值

Javascript 角度指令单向绑定控制器中的更改值,javascript,angularjs,Javascript,Angularjs,我正在使用从控制器到指令的角度单向绑定。当我更新指令中的值时,它不应该更新控制器中的值。但它是双向绑定的。有人能发现我的错误吗 angular.module("myApp",[]) .directive("myDirective",['$timeout', function ($timeout) { return { scope: {myValue: "&myAttribute"}, template: '<input type="text"

我正在使用从控制器到指令的角度单向绑定。当我更新指令中的值时,它不应该更新控制器中的值。但它是双向绑定的。有人能发现我的错误吗

angular.module("myApp",[])  
  .directive("myDirective",['$timeout', function ($timeout) {
    return {
      scope: {myValue: "&myAttribute"},
      template: '<input type="text" ng-model="myValue().name">',
      link: function (scope, iElm, iAttrs) {
        var x = scope.myValue();
        console.log(x);
        $timeout(function(){
          x.name= "directive";
        },4000);
      }
    };
  }]).controller("myController", function ($scope, $timeout) {
    $scope.someObject = {name: "test"};
    $timeout(function(){
      $scope.someObject.name= "controller";
    },2000);

});
angular.module(“myApp”,[])
.directive(“myDirective”、['$timeout',函数($timeout){
返回{
作用域:{myValue:“&myAttribute”},
模板:“”,
链接:功能(范围、iElm、iAttrs){
var x=scope.myValue();
控制台日志(x);
$timeout(函数(){
x、 name=“指令”;
},4000);
}
};
}]).controller(“myController”,函数($scope,$timeout){
$scope.someObject={name:“test”};
$timeout(函数(){
$scope.someObject.name=“控制器”;
},2000);
});

您应该像下面那样使用“@”而不是“&”

scope: {myValue: "@myAttribute"}
下面的链接解释了

您应该像下面那样使用“@”而不是“&”

scope: {myValue: "@myAttribute"}
下面的链接解释了

根据文档(对于1.xx)$compile-ampersand将返回在父作用域(getter)中执行的属性表达式的值,在本例中,它是一个对象引用,对任何对象属性的更改都将反映在这两者中

但是,在指令作用域中对myValue的更改不会影响父作用域。

根据文档(对于1.xx)$compile-ampersand将返回在父作用域(getter)中执行的属性表达式的值,在本例中,它是一个对象引用,对任何对象属性的更改都将反映在这两个视图中


但是,在指令范围内更改myValue不会影响父范围。

我不确定是否有更简单的方法,但您可以在隔离范围内使用单向绑定和
@
绑定,并在属性上添加观察者,以便在更改时更新指令中的对象

@
绑定从父级获取数据,并将其作为字符串传递给指令。要创建对象,必须使用
scope.$eval(interpolatedStrValue)

(由于getter正在将引用传递给父对象,所以与另一个答案中提到的一样,符号绑定无法工作。因此,任何更改都将更新父对象。)

请看一下下面的演示或本演示

angular.module('demoApp',[])
.指令(“单向”,单向)
.控制器(“主控制器”,主控制器);
单向函数($timeout,$parse){
返回{
范围:{
myValue:“@myAttribute”
},
模板:“”,
链接:函数(范围、元素、属性){
console.log('link',scope.myValue);
属性$observe('myAttribute',函数(myValStr){
scope.myValue=scope.$eval(myValStr);
log('controller myValue obj',scope.myValue);
});
$timeout(函数(){
log('changedir');
scope.myValue.name=“指令已更改”;
}, 4000);
}
}
}
函数MainController($scope,$timeout){
$scope.testObj={
名称:“在国防部之前。”
};
$timeout(函数(){
$scope.testObj.name='Controller modify';
}, 2000);
$timeout(函数(){
$scope.testObj.name='2nd Controller modify';
}, 8000);
}

控制器:{{testObj.name}}
指令:
我不确定是否有更简单的方法,但您可以在隔离范围内使用单向绑定和
@
绑定,并在属性上添加一个观察者,以便在更改指令中更新对象

@
绑定从父级获取数据,并将其作为字符串传递给指令。要创建对象,必须使用
scope.$eval(interpolatedStrValue)

(由于getter正在将引用传递给父对象,所以与另一个答案中提到的一样,符号绑定无法工作。因此,任何更改都将更新父对象。)

请看一下下面的演示或本演示

angular.module('demoApp',[])
.指令(“单向”,单向)
.控制器(“主控制器”,主控制器);
单向函数($timeout,$parse){
返回{
范围:{
myValue:“@myAttribute”
},
模板:“”,
链接:函数(范围、元素、属性){
console.log('link',scope.myValue);
属性$observe('myAttribute',函数(myValStr){
scope.myValue=scope.$eval(myValStr);
log('controller myValue obj',scope.myValue);
});
$timeout(函数(){
log('changedir');
scope.myValue.name=“指令已更改”;
}, 4000);
}
}
}
函数MainController($scope,$timeout){
$scope.testObj={
名称:“在国防部之前。”
};
$timeout(函数(){
$scope.testObj.name='Controller modify';
}, 2000);
$timeout(函数(){
$scope.testObj.name='2nd Controller modify';
}, 8000);
}

控制器:{{testObj.name}}
指令:
我认为符号将创建一个函数,返回父作用域中某个对象的值,因此这不是单向的。是的,&返回一个getter函数。所以它应该是一种方法,它获得了一个对象的引用,虽然,因此指令和父作用域都有相同的引用,并且对对象属性的任何更改都会自然地显示在这两个位置上偏移一点,但是如果您使用的是Angular 1.5.x,您可以使用
,我想符号将创建一个函数,返回父作用域中某个对象的值,因此这不是单向的。是的,&返回一个getter函数。因此,它应该是一种方法,它获取一个对象的引用,因此指令和父作用域都具有相同的引用,并且对对象属性的任何更改都会自然地显示在两个位置,稍微偏移一点,但是如果您使用的是Angular 1.5.x,您将可以使用
usi