javascript - 違い - angularjs 関数 呼び出し




angularjs指示文でコントローラを要求する方法 (2)

Mark Rajcokによると、ここには良いスタックオーバーフローの答えがあります:

親ディレクティブコントローラを必要とするAngularJSディレクティブコントローラ

この非常に明確なjsFiddleへのリンク: http://jsfiddle.net/mrajcok/StXFK/ ://jsfiddle.net/mrajcok/StXFK/

<div ng-controller="MyCtrl">
    <div screen>
        <div component>
            <div widget>
                <button ng-click="widgetIt()">Woo Hoo</button>
            </div>
        </div>
    </div>
</div>

JavaScript

var myApp = angular.module('myApp',[])

.directive('screen', function() {
    return {
        scope: true,
        controller: function() {
            this.doSomethingScreeny = function() {
                alert("screeny!");
            }
        }
    }
})

.directive('component', function() {
    return {
        scope: true,
        require: '^screen',
        controller: function($scope) {
            this.componentFunction = function() {
                $scope.screenCtrl.doSomethingScreeny();
            }
        },
        link: function(scope, element, attrs, screenCtrl) {
            scope.screenCtrl = screenCtrl
        }
    }
})

.directive('widget', function() {
    return {
        scope: true,
        require: "^component",
        link: function(scope, element, attrs, componentCtrl) {
            scope.widgetIt = function() {
                componentCtrl.componentFunction();
            };
        }
    }
})


//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {
    $scope.name = 'Superhero';
}

誰かが別のangularJS指示文にある指示文からコントローラを含める方法を教えてもらえますか? 私は次のコードを持っている

var app = angular.module('shop', []).
config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/', {
        templateUrl: '/js/partials/home.html'
    })
        .when('/products', {
        controller: 'ProductsController',
        templateUrl: '/js/partials/products.html'
    })
        .when('/products/:productId', {
        controller: 'ProductController',
        templateUrl: '/js/partials/product.html'
    });
}]);

app.directive('mainCtrl', function () {
    return {
        controller: function ($scope) {}
    };
});

app.directive('addProduct', function () {
    return {
        restrict: 'C',
        require: '^mainCtrl',
        link: function (scope, lElement, attrs, mainCtrl) {
            //console.log(cartController);
        }
    };
});

すべてのアカウントで、私はaddProductディレクティブのコントローラにアクセスできるはずですが、私はそうではありません。 これを行うより良い方法はありますか?


私は運がよかったし、質問へのコメントでこれに答えましたが、完全性のために完全な回答を投稿していますので、この質問を「回答済み」とマークすることができます。

それはあなたがコントローラを共有することによって達成したいものに依存します。 同じコントローラを共有することも(同じインスタンスを持つこともできます)、同じコントローラインスタンスを共有することができます。

コントローラを共有する

2つのディレクティブは同じメソッドを2つのディレクティブに渡すことで同じコントローラを使用できます。

app.controller( 'MyCtrl', function ( $scope ) {
  // do stuff...
});

app.directive( 'directiveOne', function () {
  return {
    controller: 'MyCtrl'
  };
});

app.directive( 'directiveTwo', function () {
  return {
    controller: 'MyCtrl'
  };
});

各ディレクティブはコントローラの独自のインスタンスを取得しますが、これにより、必要な数のコンポーネント間でロジックを共有できます。

コントローラが必要

コントローラの同じインスタンスを共有する場合は、 requireを使用しrequire

requireは別の指令の存在を保証し、そのコントローラをリンク関数へのパラメータとして含む。 したがって、ある要素に2つのディレクティブがある場合 、そのディレクティブは他のディレクティブの存在を要求し 、そのコントローラメソッドにアクセスできます。 これの一般的な使用例はngModelを要求することngModel

^require 、キャレットを追加して、現在の要素に加えて、上記の要素をチェックして、他の指令を探します。 これにより、「サブコンポーネント」がコントローラを介して親コンポーネントと通信できるような複雑なコンポーネントを作成することができます。 例には、タブを含めることができます。ここでは、各ペインはスイッチングを処理するために全体のタブと通信できます。 アコーディオンセットは、一度に1つだけが開かれるようにすることができる。 等

いずれの場合も、これを実行するには2つの指令を一緒に使用する必要があります。 requireはコンポーネント間で通信する方法です。

詳細については、ディレクティブのガイドページを参照してくださいhttp://docs.angularjs.org/guide/directive : http://docs.angularjs.org/guide/directive





angularjs-directive