角度指令单向绑定控制器中的变化值
angular directive one way binding changing value in controller
我使用从控制器到指令的角度单向绑定。当我更新指令中的值时,它不应该更新控制器中的值。但它是双向绑定的。有人能找到我的错误吗。
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);
});
http://plnkr.co/edit/9wihx1VYgKoTK00awN67?p=preview
我不确定是否有更简单的方法,但您可以在隔离范围中使用带有@
绑定的单向绑定,并在属性上添加一个观察者,以便在更改时更新指令中的对象。
@
绑定从父级获取数据,并将它们作为字符串传递给指令。要创建对象,必须使用scope.$eval(interpolatedStrValue)
。
(Ampersand绑定没有像另一个答案中提到的那样工作,因为getter正在传递对父对象的引用。因此任何更改都会更新父对象。)
请看下面的演示或这个小提琴。
angular.module('demoApp', [])
.directive('oneWay', OneWay)
.controller('mainController', MainController);
function OneWay($timeout, $parse) {
return {
scope: {
myValue: '@myAttribute'
},
template: '<input type="text" ng-model="myValue.name"/>',
link: function(scope, element, attrs) {
console.log('link', scope.myValue);
attrs.$observe('myAttribute', function(myValStr) {
scope.myValue = scope.$eval(myValStr);
console.log('controller myValue obj', scope.myValue);
});
$timeout(function() {
console.log('change dir');
scope.myValue.name = "directive changed";
}, 4000);
}
}
}
function MainController($scope, $timeout) {
$scope.testObj = {
name: 'before mod.'
};
$timeout(function() {
$scope.testObj.name = 'Controller modify';
}, 2000);
$timeout(function() {
$scope.testObj.name = '2nd Controller modify';
}, 8000);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular.js"></script>
<div ng-app="demoApp" ng-controller="mainController">
Controller: {{testObj.name}}<br/>
Directive: <one-way my-attribute="{{testObj}}"/>
</div>
您应该使用"@"而不是下面的"&"
scope: {myValue: "@myAttribute"}
以下链接解释
&vs@和=在angularJS 中
根据文档(对于1.xx)https://docs.angularjs.org/api/ng/service/$compile ampersand将返回在父作用域(getter)中执行的属性表达式的值,在本例中,它是一个对象引用,对任何对象属性的更改都将反映在两者中。
不过,对指令作用域中myValue的更改不会影响父作用域。
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 控制器切换后匿名功能中的访问服务数据发生变化
- 如何观察控制器/组件内阵列的变化
- 角度指令单向绑定控制器中的变化值
- AngularJS:如何在指令范围的对象发生变化时更新与控制器作用域相关联的控制器作用域
- 指令侦听控制器变量的变化
- 从不同的控制器在猫鼬更新时重复观察ng内部的变化
- 让其他同级控制器'我们知道angularjs的变化
- 为什么 AngularJS 控制器中的另一个变量会发生变化
- 观察角度控制器之间的变化
- 当你在HTML5视频控制器上点击播放时,哪些变量/属性会发生变化
- Ng显示当页面上有多个控制器的布尔值发生变化时不更新
- 带有双向绑定的孤立作用域指令不能反映控制器作用域的变化
- 当下拉菜单发生变化时,调用控制器内部的函数
- Ember JS:父路由/控制器如何观察它的子路由/控制器的变化?
- 当页面发生变化时,Angular控制器将数据传递给其他控制器
- 控制器之间的值变化是不持久的
- 如果AngularJS中的父状态控制器发生了变化,我该如何重新加载子状态?
- 在ember应用中,每次url发生变化时,都会触发路由/控制器钩子