2017-12-12 7 views
1

Angular 1.xコントローラにこのような構造を持たせ、$タイムアウトを別の$タイムアウトに含めることは正しいですか?AngularJsアプリケーションのネストされたタイムアウト

$timeout(function() { 
    $timeout(function() { 
     callbackFn($event); 
    }); 
}); 

具体的には:

私はディレクティブリンク機能とディレクティブのコントローラ内の別のタイムアウトでタイムアウトを持っています。現在、ディレクティブがレンダリングされるたびにランダムな順序で実行されます。 2つのネストされたタイムアウトを使用したソリューションが動作することがわかりましたが、この方法で使用することは問題ありません。

例:https://codepen.io/neptune01/pen/jYOGPO

+1

「正しい」 –

+0

を定義しますが、それはなぜですか?構文はうまくいくようですが、通常は合計時間を追加して1つの '$ timeout'しか使用しません。 –

+0

@AlonEitan私は、それがまだ目に見えないいくつかのケースでいくつかの悪い副作用を持つことができないことを確実にすることを意味します。 – neptune

答えて

2

を処理するためには、(ディレクティブとコントローラ[最初のディレクティブとコントローラ]の間、あなたのケースで)順番に 2以上の機能を要求し、あなたはそれらの間のモデルを渡すことができます。

より、について説明アプリケーション内のモデルアプリを柔軟にするための強力戦略の一つである

例えば

$scope.model = { anything: false } 

私たちは私たちのディレクティブでこの$scopeに合格しようとした場合、その後、私たちは、コントローラと私たちのディレクティブ間の結合2つの方法を持って、私はそれはあなたのサンプルでどのように機能するかを示しています。

app.js

var app = angular.module('app', []); 

app.directive('cDir', function($timeout){ 
return { 
    restrinct: 'E', 
    controller: 'appCtrl', 
    template: 'cdir template', 
    scope: { 
    ready: '=' 
    }, 
    link: function(scope){ 
    console.log('t1'); 
    scope.ready = true; 
    } 
}}) 

app.controller('appCtrl', ['$scope', function($scope) { 
    $scope.ready = false; 
    $scope.$watch('ready', function(isReady){ 
     if(isReady){ 
     console.log('t2'); 
     } 
    }) 
}]); 

ビューがあり

<div ng-app="app"> 
    <c-dir ready="ready"></c-dir> 
</div> 

我々はreadyディレクティブからtrueときconsole.log('t2')が現れ、ディレクティブのモデルとして$scope.readyを定義します。私たちは$scopeのリスナーとして$watchをリスナーとして使用しています。

関連する問題