2017-02-20 11 views
1

ng-repeatの終了後、Typescriptで角度ディレクティブを作成しようとすると問題が発生します。ng-repeat後のTypescriptの角ディレクティブ

これは私が指示を機能させるためにしようとしている方法です:

私はこの方法で持っているコントローラで
export interface ILightSliderInitDirectiveScope extends ng.IScope { 
} 
export class LightSliderInitDirective implements ng.IDirective { 
    public static DirectiveName: string = "lightSliderInit"; 
    link = (scope: ILightSliderInitDirectiveScope, $element: any, attrs: ng.IAttributes) => { 
     if (scope.$watch('$scope.$last')) 
      scope.$emit('ngRepeatFinished'); 
    } 
} 

_self.$scope.$on('ngRepeatFinished', function() {...}); 

とHTMLで:

<li ng-repeat="it in items" light-slider-init>...</li> 

問題はディレクティブが機能することですが、のすべての反復でif条件の中に入ります。 210。

どうすればこの問題を解決できますか?

+0

私はあなたがNGリピートで起こる可能性のある「反復」を心配する必要があるか分かりません。そのすべての要素は1回のダイジェストサイクルでレンダリングする必要があります。したがって、通常の使用では、単一のアトミック操作と見なす必要があります。なぜこのイベントが欲しいのですか?あなたはそれを何のために使う予定ですか? –

+0

リスト内のすべての要素を含むメソッドを実行して、lightsliderプラグインを使用する必要があります。 http://sachinchoolur.github.io/lightslider/examples.html – Calde8

+0

試すhttp://stackoverflow.com/a/30257914/1299394 –

答えて

0

scope.$watchは、このリスナーの登録解除機能を返します。したがって、scope.$watch('whatever')は常に真実です。また、$scopeオブジェクトに関して評価されているため、監視式に$scopeを追加しないでください。あなたがページ上の2つの以上の光のスライダを必要とする場合、それは非常に困難になるため

scope.$watch('$last', $last => { 
    if ($last) scope.$emit('ngRepeatFinished'); 
}) 
0

私はこれを行うには発火やイベントをお勧めしません。ここで
はあなたのコードがどのように見えるべきです。

これはng-repeatにあるため、実際にリピータのすべてのインスタンスに対してリンク機能が実行されます。だから$watchの値が$lastではなく、リピータの最後の項目でコードを実行するだけです。

https://stackoverflow.com/a/30257914/1299394に基づくコード:

export class LightSliderInitDirective implements ng.IDirective { 
    restrict: 'A', 
    link: function(scope: ILightSliderInitDirectiveScope, element: JQuery, attrs) { 
     if (scope.$last) { 
      // This is the last item in the repeater 
      // Instead of firing an event, just initialize the light gallery right here. 
      element.parent().lightGallery(); 
     } 
    } 
}; 
関連する問題