2016-06-04 3 views
1

В angularJs У меня есть куча контроллеров с некоторым Funktions они же:угловых расширяющих методы контроллера

angular.module('myApp').controller(...){ 

    function lockForm(id){ 
     ... 
    } 

    function releaseForm(id){ 
     ... 
    } 

    function dbError(e){ 
     ... 
    } 

    // and some other little stuff again and again in every controller 
} 

примеры, которые я прочитал все основано на расширение (Смешение) материала от $ объема и @this , Разве нет способа расширить весь контроллер, как есть?

С благодарностью Shushanth Pallegar Я решил свою проблему. Это не совсем то, что я хотел, но лучше, чем раньше.

// base ctrl 
angular.module('myApp').controller('baseViewCtrl', function ($scope, viewData) { 

     this.lockForm = function() { 
      viewData.isLoading = true; 
     }; 

     // ... and others 

}); 


// child ctrl 
angular.module('myApp').controller('childCtrl', function ($scope) { 
     var viewData = { 
      // some stuff 
     }; 

     // inject from basecontroller 
     angular.extend(this, $controller('baseViewCtrl', {$scope: $scope, viewData: viewData})); 

     // link $scope 
     $scope.viewData = viewData; 
     $scope.onSelectUnit = onSelectUnit; 

     // child controller methods 
     function onSelectUnit(){ 
      this.lockForm(); 
      ... 
     } 
}); 

Это выглядит немного уродливой на всех, потому что я избегал @this почти везде

Возможно, я идти по этому пути и использовать базу вместо @this, чтобы сделать его более ясным, что впрыскивают методы:

// child ctrl 
angular.module('myApp').controller('childCtrl', function ($scope) { 
     var viewData = { 
      // some stuff 
     }; 

     // inject from basecontroller 
     var base = $controller('baseViewCtrl', {$scope: $scope, viewData: viewData}); 

    // link $scope 
    $scope.viewData = viewData; 
    $scope.onSelectUnit = onSelectUnit; 

    // child controller methods 
    function onSelectUnit(){ 
     base.lockForm(); 
     ... 
    } 
+0

Put общие функции службы и ввести услугу. Контроллеры должны быть очень тонкими. Бизнес-логика принадлежит сервисам – charlietfl

+0

Вы можете использовать концепцию родительского контроллера и дочернего контроллера. Кроме того, вы можете использовать функцию service/factory. – Sarju

ответ

3

Использование $ службы контроллера и передать имя контроллера вам нужно расширить, как показано ниже

родительский контроллер

angular.module('myApp').controller('parentController',function(){ 

    $scope.lockForm = function(id){ 
     ... 
    } 
    }); 

контроллер ребенка

angular.module('app').controller('childController',function($controller){ 

    var parentController = $controller('parentController',{$scope:$scope}); 

    console.log(parentController.lockForm); 

    }); 

см $controller

в заказ распространяется на this, использовать как ниже

angular.module('app').controller('childController',function($controller){ 

    var parentController = $controller('parentController',{$scope:$scope}); 
    angular.extend(this,parentController); 

    console.log(this.lockForm); 

    }); 

Если вы используете функции с прикрепление т шланга, чтобы ограничить вашу потребность в возврате этих функций, как показано ниже.

angular.module('myApp').controller('parentController',function(){ 

     var _lockForm = function(id){ 
      ... 
     } 

     return{ 
      lockForm = _lockForm 
     } 

     }); 

так в расширенной контроллер можно использовать как ниже

var extendedController = $controller('parentController',{$scope:$scope}); 

    extendeController.lockForm('123'); 
+0

Я вижу. Но что происходит с закрытием импортированных методов (или более названных функций)? – Steffomio

+0

@Steffomio, вы вернули свою функцию и использовали их. Я обновил ответ с этим реградом! –