0

2 つのコントローラーが定義されています。

var myApp = angular.module('nestedControllersModule',[]); 
myApp.controller('ParentController', ['$scope', function($scope) { 
}]);

myApp.controller('ChildController', ['$scope', '$injector',  function($scope, $injector) { 

$injector.invoke(ParentController, this, {$scope: $scope}); 
}]);

これにより、次のようになります。 ReferenceError: ParentController が定義されていません。

このコードは、ParentController が次のように定義されている場合にのみ機能します。

function ParentController($scope) {}

親で定義された共通関数を継承できるように、子に親を注入しようとしています。

var myApp = angular.module('nestedControllersModule',[]); 
myApp.controller('ParentController', ['$scope', function($scope) {
    $scope.name = 'ParentName'; 
    $scope.Type = 'ParentType'; 
    $scope.clickme = function() { 
        alert('This is parent controller "ParentController" calling'); 
    } 
}]);

myApp.controller('ChildController', ['$scope', '$injector', '$ParentController',  function($scope, $injector, $ParentController) { 
    $injector.invoke(ParentController, this, {$scope: $scope}); 
    $scope.name = 'Child';
}]);
4

3 に答える 3

0

$controller サービスを使用して可能な Mixin パターンの使用を検討してください。

あなたの例では、 $injector サービスを $controller サービスに置き換えます。

var myApp = angular.module('nestedControllersModule',[]); 
myApp.controller('ParentController', ['$scope', function($scope) {
    $scope.name = 'ParentName'; 
    $scope.Type = 'ParentType'; 
    $scope.clickme = function() { 
        alert('This is parent controller "ParentController" calling'); 
    } 
}]);

myApp.controller('ChildController', ['$scope', '$controller', '$ParentController',  function($scope, $controller, $ParentController) {
    $controller('ParentController',{$scope: $scope})
    $scope.name = 'Child';
}]);

これは、$controller サービスの使用に関する概要です: http://vadimpopa.com/split-large-angularjs-controllers-using-the-mixin-pattern/

于 2014-11-21T18:16:58.947 に答える
0
myApp.controller('ParentController', ['$scope', function($scope) { 
}]);


myApp.controller('ChildController', ['$scope', 'ParentController',  function($scope, ParentController) {
    // ok now you have ParentController
}]);

ただし、コントローラー間でデータ/関数を共有するか、PubSub モデルを使用するには、サービスを使用する必要があると思います。

AngularJS のコントローラ間で通信する正しい方法は何ですか?

これにより、アプリのパーツ間の結合が減少します。

于 2013-10-18T03:09:40.483 に答える
0

これは、目的を達成するための基本的な回避策です。

var myApp = angular.module('nestedControllersModule',[]); 
myApp.factory('ParentControllerFactory', function () {
    function ParentControllerFactory($scope) {
        $scope.name = 'ParentName'; 
        $scope.Type = 'ParentType'; 
        $scope.clickme = function() { 
            alert('This is parent controller "ParentController" calling'); 
        }
    }
    return (ParentControllerFactory);
})
.controller('ParentController', ['$scope', '$injector', 'ParentControllerFactory', function ($scope, $injector, ParentControllerFactory) {
    $injector.invoke(ParentControllerFactory, this, {
        $scope: $scope
    });
}]) 
.controller('ChildController', ['$scope', '$injector', 'ParentControllerFactory', function ($scope, $injector, ParentControllerFactory) {
    $injector.invoke(ParentControllerFactory, this, {
        $scope: $scope
    });
}]);

前述のように、共通性を管理するサービスを適切に実装することを検討する価値があるため、回避策と言います (または、共通性をディレクティブに分割します。たとえば、クリックミーが良い候補です)。

...また、$injector.invoke(ParentControllerFactory上記のように、後でスクリプトを縮小する場合は、ヒッシーなフィット感を解消する可能性が高いことに注意してください。そのため、どこでどのように使用するかに注意してください。

于 2014-01-07T07:45:24.090 に答える