0

私は理解しようとしている簡単なシナリオを持っています。

コントローラーがあります(ダイアログにバインドされています)。コントローラーは次のようになります。

app.controller('fullCtrl', function ($scope, $dialog, $http, $log, apiService, stateService, promiseData, dialog, leaf, CONST) {
...
}

ダイアログの UI 要素の 1 つは、ディレクティブを使用してレンダリングされているキャンバスです。

<div leaf-graph structure=structure></div>
app.directive('leafGraph', ['$timeout',  function (timer, $log) {
...
}

問題は、ディレクティブがコントローラーと対話する方法を探しているため、ユーザーがディレクティブをクリックすると、コントローラーが新しいデータに再バインドされることです。

基本的に、ユーザーがキャンバス上のいくつかの領域をダブルクリックするJavaScript側ですべてが行われ、コントローラーでいくつかのアクションをトリガーする必要があります。

コントローラーをディレクティブに渡す方法はありますか?

どうも

4

2 に答える 2

2

そのスコープ内で定義したコントローラー関数を含め、ディレクティブで $scope に既にアクセスできます。次に例を示します: Egghead.io - コントローラーと対話するディレクティブ

于 2013-04-22T21:42:24.320 に答える
0

ng-repeat ループ内で $apply を使用するディレクティブは、「エラー: $digest は既に進行中です」を引き起こすことに注意してください。

そのエラーを生成することなく、少なくとも 2 つの他の方法が代わりに機能するようです。

  • これにより、名前付き関数にパラメーターを渡すことができます。

    scope.$eval(attrs.repeatDone);

利用方法:

<div ng-repeat="feed in feedList" repeat-done="layoutDone($index)"> or
<div ng-repeat="feed in feedList" repeat-done="layoutDone()">
  • これには関数名のみが必要で、「()」またはパラメーターを渡す必要はありません。

    スコープ[attrs.repeatDone]();

利用方法:

<div ng-repeat="feed in feedList" repeat-done="layoutDone">

ディレクティブ:

.directive('onEnter', function() {
    return function(scope, element, attrs) {
        element.on('keydown', function(event) {
            if (event.which === 13) {
                scope.$eval(attrs.onEnter);
            }
        })
    }
})
于 2013-04-23T01:12:20.687 に答える