描述我的问题的最好方法是进行演示。这就是我希望使用我的指令的方式:
<my-directive my-attr="{'property': obj}"></my-directive>
其中“ obj”是作用域上要双向绑定的对象。问题是我还需要获取对象“ obj”的名称。
我想出的部分解决方案是将对象名称('obj')作为字符串传递,并使用$ parse获取对象。但是,如果这不会像使用范围“ =”那样以相同的方式影响$ parent范围。如何手动编写双向绑定,以便对作用域上的对象所做的更改将更改父作用域上的对象?
最佳答案
经过大量研究,并参考following issue,这是Scope的扩展,它允许双向绑定(本质上是Angular代码,仅修改为在nodeLinkFn
之外工作):
angular.module('scopeBindExtention', [])
.run( [ '$rootScope', '$parse', function( $rootScope, $parse ) {
var extended = angular.extend( $rootScope, {} );
extended.$bindTwoWay = function( scopeName, parentName ) {
var scope = this,
parentScope = scope.$parent;
lastValue,
parentGet,
parentSet,
compare;
parentGet = $parse(parentName);
if (parentGet.literal) {
compare = angular.equals;
} else {
compare = function(a,b) { return a === b; };
}
parentSet = parentGet.assign || function() {
// reset the change, or we will throw this exception on every $digest
lastValue = scope[scopeName] = parentGet(parentScope);
throw new Error( "Expression '" + parentName + "' is non-assignable!" );
/*
throw $compileMinErr('nonassign',
"Expression '{0}' is non-assignable!",
parentName);
*/
};
lastValue = scope[scopeName] = parentGet(parentScope);
var unwatch = parentScope.$watch($parse(parentName, function parentValueWatch(parentValue) {
if (!compare(parentValue, scope[scopeName])) {
// we are out of sync and need to copy
if (!compare(parentValue, lastValue)) {
// parent changed and it has precedence
scope[scopeName] = parentValue;
} else {
// if the parent can be assigned then do so
parentSet(parentScope, parentValue = scope[scopeName]);
}
}
return lastValue = parentValue;
}), null, parentGet.literal);
scope.$on('$destroy', unwatch);
}
}]);
客户应致电:
scope。$ bindTwoWay('childModelName','parentModelName');
关于javascript - Angularjs手册双向绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19746809/