ここに一種のソリューションがあります: 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();
});
}
それでも、コードを異なるパーシャル/ディレクティブ/などに分割する方が良いと思います...