这是一种解决方法:http://plnkr.co/edit/Vd4YtCYcZKs9mMQLPK8v? p =preview
第一个想法是将属性中指定的对象克隆到指令的范围内:
scope.$parent.$watch(attrs.scope, function(nv) {
angular.extend(scope, nv);
},true);
它效率不高(每次对象更改时,Angular 都应将其属性复制到范围内),但它是实现您想要的简单方法。
这个想法的问题是你只有单向绑定(从外部范围到内部)。
如果您有双向绑定,则需要对指令范围的更改做出反应以反映父级。有点儿:
link: function(scope, element, attrs) {
var watches = [];
var unregister = scope.$parent.$watch(attrs.scope, function(nv) {
watches.forEach(function(w) { w(); });
watches.length = 0;
for (var key in nv) {
if (key) {
scope[key] = nv[key];
watches.push(scope.$watch(key, function(key) {
return function(knv) {
nv[key] = knv;
};}(key)));
}
}
},true);
scope.$on('$destroy', function(){
unregister();
});
}
我仍然认为最好将代码拆分为不同的部分/指令/等......