ここに問題があります。私はメインディレクティブと呼ばれる第三者指令を持っています。AngularJS指令コントローラ機能を無効にします
app.directive('mainDirective', function() {
return {
scope: {
foo: '&'
// attrs
},
controller: function($scope) {
$scope.click = function() {
window.alert($scope.foo());
}
},
template: '<button ng-click="click()">Click me</button>'
}
});
だから私は自分のディレクティブを作りたいが親ディレクティブ第三者ディレクティブの属性にアプリケーション固有のデフォルト値を割り当てると呼ばれます。私は別の子ディレクティブ親ディレクティブロジックを保持したい場合はどう
app.directive('parentDirective', function() {
return {
scope: {
foo: '&?',
attr2: '='
// lots of attrs
},
controller: function($scope) {
$scope.attr1 = "some default value"
$scope.foo = function() {
return "not overrided"
}
if (this.foo) {
$scope.foo = this.foo
}
},
template: '<div class="some-styling"><main-directive foo="foo()" attr1="attr1" attr2="attr2"></main-directive></div>'
}
});
。 属性のオーバーロードは簡単です。「コンパイル」機能を使用できます。しかし、関数のオーバーライドは可能ですか?
app.directive('childDirective', function() {
return {
scope: false,
require: 'parentDirective',
link: function(scope, element, attr, controller) {
controller.foo = function() {
return "overrided";
}
},
compile: function(element, attr) {
attr.attr2 = "attr2";
}
}
});
隔離されているのではなく、子スコープを使用することで簡単に行うことができます。 またはテンプレートを使用して拡張を使用します。しかし、テンプレートを使ってディレクティブを拡張すると、親 "スコープ"と "テンプレート"の定義を子ディレクティブにコピーし、これ以外のすべての非デフォルト属性を転送する必要があります。
重要な質問は、属性を転送せずに分離スコープを使用して親ディレクティブ機能をオーバーライドする方法です。ここで
が DEMO
$ parentを使ってみましたか?あなたの関数が親スコープ内にある場合は、$ parentを使ってその関数にアクセスすることができます。 – acostela
確かに、ng-if指令が親と子の間のどこかにあればどうでしょうか? $ parentを使うIMHOはここでの解決策ではありません。 $ parentが悪い習慣とみなされるという事実にもかかわらず。 – dagi12