2

私はインターネット全体を検索しましたが、解決策が見つかりません助けてください!

directive('menu',function(){
    return{
        link : function(scope,element,attrs){
            scope.foo = function(){
            alert('test!');
            }
        },
        controller : function($scope){
            $scope.foo();
        }
    }
});
4

2 に答える 2

3

foo()usingへの呼び出しを遅らせる$evalAsync():

controller : function($scope){
    $scope.$evalAsync(function() {
        $scope.foo();
        console.log($scope);
    });
}

fiddle

$timeout()の代わりに使用することもできます$evalAsync()。どちらもリンク関数を最初に実行できます。

于 2013-07-22T19:28:38.517 に答える
1

Ye Liu が言ったように、コントローラーはディレクティブのコンパイルを呼び出してから、関数をリンクします。angular ディレクティブ ドキュメント ( http://docs.angularjs.org/guide/directive ) から:

コントローラはリンク前フェーズの前にインスタンス化されます

コントローラーはアプリのスコープ内にあり、リンク後の関数が完了すると、ディレクティブはこのスコープの子になります。リンク関数の目的は、モデル データをテンプレートにバインドし、バインドされた変数の監視を設定することであり、目立たない「ディレクティブ オブジェクト」を作成することではないと考えてください。

ディレクティブ スコープ変数にアクセスするためにリンク関数内に foo 関数を設定しようとしている場合は、ディレクティブ デリゲート関数と "scope:" ディレクティブ属性のバインドされた変数を調べてください。angular ディレクティブ チュートリアルでは、最終的な例 ("zippy") としてこれのやや鈍いバージョンを提供し、中間ハンドラーを介して起動しない Angularjs ディレクティブ デリゲートは、テンプレート自体から呼び出すことができるデリゲート関数の例を示します。

于 2013-07-22T15:36:35.677 に答える