2015-04-26 4 views
0

У меня есть приложение на основе угловой, который я инициализировать так:Как получить экземпляр контроллера, который был создан AngularJS?

myapp.init = (function() { 
    'use strict'; 

    var angularApp = angular.module('myapp', []) 
    .directive('homeIterationDirective', function() { 
     return function (scope, element, attrs) { 
     var isTopCard = scope.$last ? true : false; 
     cards.initSingleSwipe(element.get(0), function (event) { 
      // I want to call indexPageController.onSwiped(event) here! 
     }, isTopCard); 
     }; 
    }) 
    .directive('homeDirective', function() { 
     return function (scope, element, attrs) { 
     cards.initPanel(element, function (event) { 
      // I want to call indexPageController.onButtonPressed(event) here! 
     }); 
     }; 
    }); 

    angularApp.factory('AjaxService', myapp.services.AjaxService); 
    angularApp.controller('IndexPageController', ['$scope', '$http', '$sce', 'AjaxService', myapp.pages.IndexPageController]); 

}()); 

Мой контроллер выглядит следующим образом:

myapp.pages.IndexPageController = function ($scope, $http, $sce, MyService) { 
    'use strict'; 

    var somevalue = {}; 

    this.onSwiped = function (event) { 
    doSomethingWith(event, somevalue); 
    }; 

    this.onButtonPressed = function (event) { 
    doSomethingWith(event, somevalue); 
    }; 

}; 

В 2 директивы homeIterationDirective и homeDirective У меня есть 2 обратные вызовы cards.initSingleSwipe и cards.initPanel. Внутри этих обратных вызовов я хочу вызвать общедоступные методы моего контроллера, но у меня нет экземпляра, доступного для Angular, созданного с IndexPageController. Как я могу это достичь?

+0

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

+0

@DarinDimitrov Я хочу назвать это из того места, где я инициализирую контроллер, поэтому прямо под 'angularApp.controller (...)' – Timo

+0

Просто позвоните 'this.blah()' – Chandermani

ответ

1

Используйте (впрысните) службу (а не контроллер), если вы хотите «вызвать общедоступный метод» из другого места, возможно, из другого контроллера.

angularApp.controller('MyController', function ($scope, IndexPageService) { 
    IndexPageService.blah(); 
})); 

Контроллер предназначен для приема и изменения $ scope (методы добавления, переменные..etc). $ Scope может использоваться в шаблоне (html), который использует сам контроллер.

+0

Прошу прощения, я думаю, что мой вопрос был недостаточно ясным. Я переписал его, чтобы все было ясно. – Timo

0

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

Но если вы хотите, чтобы вызвать этот метод вне углового контекста, то можно добиться того, что, как это:

<div id="foo" ng-controller="IndexPageController"> 
    <!-- code --> 
</div> 

Теперь, вы можете написать что-то вроде этого:

angular.element(document.getElementById("foo")).scope().blah(); 
+0

Прошу прощения, я думаю, что мой вопрос был недостаточно ясным. Я переписал его, чтобы все было ясно. – Timo

0

Я также думаю, вы должны использовать сервис для этого. Но если вам все еще нужно вызвать один контроллер от другой, вы можете использовать $ контроллер службы

(function() { 
    var app = angular.module('myApp', ['ngRoute']); 

    app.config(function ($routeProvider) { 
     $routeProvider.when("/first", { 
       templateUrl: 'app/view.html', 
       controller: 'firstCtrl' 
      }).when("/second", { 
       templateUrl: 'app/view.html', 
       controller: 'secondCtrl' 
      }) 
      .otherwise({ 
       redirectTo: "/first" 
      }); 
    }); 

    app.controller('firstCtrl', function ($scope) { 

     $scope.name = "first Controller"; 
     $scope.nameToUpper = function() { 
      return $scope.name.toUpperCase(); 
     } 
    }); 

    app.controller('secondCtrl', function ($scope, $controller) { 

     var newScope = $scope.$new(); 
     $controller('firstCtrl', { $scope: newScope }); 

     $scope.name = newScope.nameToUpper() + 'from second ctrl'; 
    }); 

}()) 

и мнение

<div> 
    {{name}} 
</div> 
+0

У меня есть доступ к $ controller из моей директивы? (см. вопрос edit) – Timo

+1

Привет, Тимо, я не пробовал вызывать $ compile из директивы, но я бы сказал, что это должно быть возможно. Опять же, вызов функции, определенной в контроллере из другого места, не очень хорошая практика. Поэтому, пожалуйста, рассмотрите возможность использования службы из межмодульной связи –

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