2017-12-12 4 views
0

にコントローラとディレクティブのリンクから$タイムアウトコールバックを実行します。Angularjs:私は、カスタムディレクティブで、このシンプルなアプリを持っており、それは、コントローラの右の順

angular.module('app', []) 
.directive('customDir', function($timeout){ 
    return { 
     restrict: 'E', 
     template: 'custom dir template', 
     controller: 'customDirCtrl', 
     link: function() { 
      $timeout(function(){ 
      console.log('link'); 
      }); 
     } 
    } 
}) 
.controller('customDirCtrl', function($timeout) { 
    $timeout(function(){ 
      console.log('ctrl'); 
      }).then(function(){ 
    }); 
}); 

ディレクティブのリンク機能とコントローラの両方がどのタイムアウトコールバックが含まれています上記の場合、ctrlの関数、linkの関数の順に実行されます。ここをクリックしてください:https://codepen.io/neptune01/pen/EoxgvV

私が必要とするのは、コントローラのタイムアウトコールバックがディレクティブのリンクからのコールバック後に実行されるようにすることです。それ、どうやったら出来るの?

+1

を行った場合、あなたは明らかにXYの問題を抱えているリンクから放送することができます。なぜそれが必要ですか?あなたの事件を説明してください。また、これはコントローラだけで処理することもできます。現在のリンク関数は$ postLinkコントローラフックのために時代遅れです。 – estus

+0

@estus私は、ウィンドウ内のスクロールイベントハンドラをリンク内に持っていて、内部のdivをスクロールして、垂直なサイドメニューを含み、スクロールスクロールしてメニュー項目にアクティブなクラスを追加します。私はメニューの下の項目(最後のものではない)の1つをクリックすると、常にスクロール位置のためにアクティブとしてマークされる最後の項目で終わるので、ユーザーがメニュー項目をクリックしたときにこのクラスの追加をオーバーライドしたい。クリックハンドラ関数はコントローラ内にあり、リンク内のスクロールイベントハンドラにあります。短いです:) – neptune

+1

はい、これはXYの問題です。タイムアウト命令のような軽薄なものが必要なことは、何かが間違っていたことを示しています。本当のケースとhttp://stackoverflow.com/help/mcveで質問を再入力することをお勧めします。コントローラとリンクの関数間の分割はあまり意味がありません。スコープORコントローラのインスタンスでメソッドを定義することができます(または定義する必要があります)。言われたように、現在のところ、リンク機能は必要ありません、これはコントローラだけで扱うことができます。 – estus

答えて

0

initialization of the directiveは同じ順序でこれらの4つのイベントで構成されています

  1. がコンパイル
  2. コントローラ
  3. リンク前

だから、あなたが必要

  • ポストリンクそのタイムアウトをコントローラの初期化の前に実行する代わりに、compile関数に移動します。

  • 0

    ディレクティブに何らかのイベントがある場合は、その要素をバインドして変更できますが、タイムアウトを行うことができます。あなたが変数を持っていれば、$ watchを使うことができます。もし他のイベントがあるなら$ onと$ emitを使ってそのイベントをコントローラに送ることができます。それはかなり解決策ではありませんが、うまくいく可能性があります。

    0

    タイムアウトが

    angular.module('app', []) 
    .directive('customDir', function($timeout){ 
        return { 
        restrict: 'E', 
        template: 'custom dir template', 
        controller: 'customDirCtrl', 
        link: function ($scope) { 
         $timeout(function(){ 
         console.log('link'); 
         $scope.$broadcast('linkTimeoutDone')    
         }); 
        } 
    } 
    }) 
    .controller('customDirCtrl', function($scope) { 
        $scope.$on('linkTimeoutDone', function() { 
        console.log('ctrl'); 
        }); 
    }); 
    
    関連する問題