如何在带点符号的隔离作用域中创建具有嵌套属性的双向绑定。我以为'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"
};
}
};
}])发布于 2014-01-12 14:02:15
隔离作用域通常只对模板有用,不应将其用作声明如何解释指令属性的方法。这是因为大多数没有模板的指令通常需要其环境的子作用域或直接作用域的语义。
在您的例子中,您甚至可能不需要$watch,因为对象引用支持双向数据绑定,但如果没有完整的代码,我就不能确定。
如果你想知道独立作用域语义到普通作用域语义的转换:
@name -> attrs.name
=name -> $scope.$eval(attrs.name);
&name -> function() { return $scope.$eval(attrs.name); } 编辑2:
在您的评论之后,我想出了这个plunker。要保留双向数据绑定,您必须使用“。在您的ng-model声明中。这是因为双向数据绑定不适用于值类型,因为它们是不可变的。例如,您不能更改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"
};
});HTML:
<body ng-controller="MainCtrl">
<p>Hello {{data.name}}!</p>
<two-way thing="data"></two-way>
</body>发布于 2015-01-27 20:24:50
在这些情况下,我使用的内容如下:
.directive("myDirective", [function() {
return {
restrict: "E",
scope: {
data: "="
},
controller: function($scope){
$scope.dot = $scope //<--- here is the trick
}
};
}])然后,您始终可以通过dot.data = 'whatever'从继承的作用域更改指令作用域中的data,而无需设置监视器。
虽然不是很优雅,但在不使用controller as语法并且不想要$parent噩梦的情况下,它工作得很好。
https://stackoverflow.com/questions/21071646
复制相似问题