angularjs - Call from Plain JavaScript to Angular Service to Controller -
i using $rootscope.$emit() raising events service controller.
it working fine when emitting instance of service referenced in controller $rootscope.$on not getting called when emitting instance of service got angular injector in plain javascript .
following code
plain javascript
var msghandlerjs = function () { var injector = angular.injector(['ng', 'services']); var amsghandlerservice = injector.get('msghandlerservice'); amsghandlerservice.testscopewatch(); } calling above when dom ready :
angular.element(document).ready(function () { msghandlerjs(); }); service
(function (module) { var msghandlerservice = function ($rootscope, $http, $q, $timeout) { var testscopewatch = function () { $http.get('~/test.json').then(function (result) { emailpacket = result.data.packet; $rootscope.$emit("emailpacketchanged", emailpacket); }); }; return { //making public testscopewatch:testscopewatch, }; }; module.factory("msghandlerservice", ["$rootscope","$http", "$q","$timeout", msghandlerservice]); }(angular.module("services"))); controller
(function (module) { function testcontroller($rootscope,$scope, msghandlerservice) { $rootscope.$on("emailpacketchanged", function(event,data){ alert('here am'); }; }; module.controller("testcontroller", ["$rootscope","$scope", "msghandlerservice", testcontroller]); }(angular.module('app')));
you need proper injector of application, angular.injector creates new injector, has nothing injector bootstrapped app. instance of service (yourservice, rootscope inside it) injector different instance in app. should instead use getter .injector() rootelement of application.
i.e if have ng-app or manually bootstrapping, injector out of element. example:
var injector = angular.element(document.queryselector('[ng-app]')).injector(); if app root document (html) injector document i.e :
var injector = angular.element(document).injector() also if want scope bindings reflect need invoke digest cycle (alert work fine ofcourse):
var msghandlerjs = function() { var injector = angular.element(document).injector(); var amsghandlerservice = injector.get('msghandlerservice'); var $rootscope = injector.get('$rootscope'); amsghandlerservice.testscopewatch(); $rootscope.$digest(); } (function(module) { var msghandlerservice = function($rootscope, $http, $q, $timeout) { var testscopewatch = function() { //$http.get('~/test.json').then(function(result) { // emailpacket = result.data.packet; $rootscope.$emit("emailpacketchanged", {}); // }); }; return { //making public testscopewatch: testscopewatch, }; }; module.factory("msghandlerservice", ["$rootscope", "$http", "$q", "$timeout", msghandlerservice]); }(angular.module("services", []))); (function(module) { function testcontroller($rootscope, $scope, msghandlerservice) { $rootscope.$on("emailpacketchanged", function(event, data) { $scope.got = "got message!!"; }); } module.controller("testcontroller", ["$rootscope", "$scope", "msghandlerservice", testcontroller]); }(angular.module('app', ['services']))); var msghandlerjs = function() { var injector = angular.element(document.queryselector('[ng-app]')).injector(); var amsghandlerservice = injector.get('msghandlerservice'); var $rootscope = injector.get('$rootscope'); amsghandlerservice.testscopewatch(); $rootscope.$digest(); } angular.element(document).ready(function() { msghandlerjs(); }); <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div class="test" ng-app="app" ng-controller="testcontroller"> {{got}} </div>
Comments
Post a Comment