2016-11-20 2 views
2

Я создаю модульное приложение в angularjs, у меня есть два модуля дома и шаблоны. как использовать функции одного модуля во второй модуль
Модуль Главных
AngularJS как использовать функцию от одного контроллера в другом контроллере

angular.module('home',[]).controller('homeCtrl', function($scope){ 
     //this function to templatesModule 
     $scope.useThisFunctionInTemplateCtrl = function(){} 
    }) 

шаблоны модулей

angular.module('templates',[]).controller('templatesCtrl', function($scope){ 
     //here function from homeCtrl 
     $scope.functionFromhomeCtrl = function(){} 
    }) 

Главного app.js

angular.module('myApp',['home', 'templates']); 
+0

Вы можете использовать '$ rootScope' –

+1

... или рассмотреть возможность использования услуги, если вы wan't разделить логику между контроллерами. – naeramarth7

+0

@JyothiBabuAraja $ rootScope не работает – Kaker

ответ

3

Вам нужен service для обмена информацией между контроллерами:

angular.module('yourModule').factory('yourService', function(){ 
    var self = this; 

    self.sharedFunction = function(){} 

    return self; 
}) 

и внедрить его в контроллерах

angular.module('home',[]).controller('homeCtrl', function($scope, yourService){ 
    //this function to templatesModule 
    $scope.useThisFunctionInTemplateCtrl = yourService.sharedFunction(); 
}) 

$ rootScope для хранения глобальных переменных, следует избегать иначе.

+0

Модуль «home» зависит от службы, определенной в модуле с именем «yourModule». Зависимость должна быть включена: 'angular.module ('home', ['yourService']). Controller ...'. – georgeawg

+0

Да, если 'yourModule' является новым модулем, он должен быть зарегистрирован как 'angular.module ('yourModule', [/ * dependencies * /])' и должен быть включен как 'angular.module ('home', [ 'yourModule']) ', или он может ввести его в' myApp', чтобы сделать его доступным для каждого другого модуля. – mcrvaz

+0

Я создаю фабрику – Kaker

0

Это не хорошая практика, но удовлетворяет ваши потребности.

Доступ к функциям можно получить через controllers с использованием $rootScope.

Подробнее от here

Home Controller:

angular.module('home',[]).controller('homeCtrl', function($scope, $rootScope){ 
     //this function to templatesModule 
     $rootScope.useThisFunctionInTemplateCtrl = function(){} 
    }) 

Другой контроллер:

angular.module('templates',[]).controller('templatesCtrl', function($scope, $rootScope){ 
    //here function from homeCtrl 
    $rootScope.useThisFunctionInTemplateCtrl(); //from another controller 
    $scope.functionFromhomeCtrl = function(){} 
}) 
+1

, в то время как это действительно сработало, существует множество причин, по которым такой подход следует избегать. – Claies

+0

Спасибо, я обновил его. –

0

Вы можете сделать это двумя способами:

1. Создание и использование AngularJS службы:

Вот полный пример того, как создать AngularJS службы и использовать AngularJS Service Mehtod в разные Контроллеры:

//AngularJS Module 

var app = angular.module("Demo", ["ngRoute"]) 

//AngularJS Route Config 

app.config(function($routeProvider, $locationProvider) { 
    $routeProvider.caseInsensitiveMatch = true; 
    $routeProvider.when("/products/details/:id", 
    { 
     templateUrl: "Temaplates/details.html", 
     controller: "productDetailsController" 
    }) 
    .when("/products/edit/:id", 
    { 
     templateUrl: "Temaplates/edit.html", 
     controller: "productEditController" 
    }) 

// AngularJS Service 

app.factory('productService', function ($http, $routeParams) { 
     return { 
      getDataById: function() { 
       //return promise from here 
       return $http.get("http://localhost:43618/api/Products", { 
        params: { id: $routeParams.id } 
       }); 
      } 
     }; 
    }); 

// AngularJS Controllers Where Service Method has been used 

app.controller("productDetailsController", function ($scope, $http, $routeParams, $location, productService) { 
    $scope.message = "Product Details"; 
    productService.getDataById().then(function (response) { 
     $scope.product = response.data; 
    }, function (error) { 
     console.log("Error occured ", error); 
    }); 
}); 

.controller("productEditController", function ($scope, $http, $routeParams, $location, productService) { 
    $scope.message = "Edit Page"; 
    $scope.product = {}; 

    productService.getDataById().then(function (response) { 
     $scope.product = response.data; 
    }, function (error) { 
     console.log("Error occured ", error); 
    }); 

    $scope.updateProduct = function (product) { 
     $http({ 
      method: "PUT", 
      url: "http://localhost:43618/api/Products", 
      params: { id: $routeParams.id }, 
      data: product 
     }) 
     .success(function() { 
      alert("Product Updated Successfully"); 
      $location.path('/products'); 
     }); 
    } 

}) 

2. Использование rootScope объекта

Но есть проблема с использованием объекта rootScope, а именно: всякий раз, когда вы обновляете объект rootScope, страница будет потеряна.

Так что всегда лучше использовать AngularJS Service над rootScope

Смежные вопросы