Call AngularJS from legacy code
I'm using AngularJS to build HTML controls that interact with a legacy Flex application. All callbacks from the Flex app must be attached to the DOM window.
For example (in AS3)
ExternalInterface.call("save", data);
Will call
window.save = function(data){
// want to update a service
// or dispatch an event here...
}
From within the JS resize function I'd like to dispatch an event that a controller can hear. It seems that creating a service is the way to go. Can you update a service from outside of AngularJS? Can a controller listen for events from a service? In one experiment (click for fiddle) I did it seems like I can access a service but updating the service's data doesn't get reflected in the view (in the example an <option>
should be added to the <select>
).
Thanks!
Interop from outside of angular to angular is same as debugging angular application or integrating with third party library.
For any DOM element you can do this:
angular.element(domElement).scope()
to get the current scope for the element angular.element(domElement).injector()
to get the current app injector angular.element(domElement).controller()
to get a hold of the ng-controller
instance. From the injector you can get a hold of any service in angular application. Similarly from the scope you can invoke any methods which have been published to it.
Keep in mind that any changes to the angular model or any method invocations on the scope need to be wrapped in $apply()
like this:
$scope.$apply(function(){
// perform any model changes or method invocations here on angular app.
});
Misko gave the correct answer (obviously), but some of us newbies may need it simplified further.
When if comes to calling AngularJS code from within legacy apps, think of the AngularJS code as a "micro app" existing within a protected container in your legacy application. You cannot make calls to it directly (for very good reason), but you can make remote calls by way of the $scope object.
To use the $scope object, you need to get the handle of $scope. Fortunately this is very easy to do.
You can use the id of any HTML element within your AngularJS "micro-app" HTML to get the handle of the AngularJS app $scope.
As an example, let's say we want to call a couple of functions within our AngularJS controller such as sayHi() and sayBye(). In the AngularJS HTML (view) we have a div with the id "MySuperAwesomeApp". You can use the following code, combined with jQuery to get the handle of $scope:
var microappscope = angular.element($("#MySuperAwesomeApp")).scope();
Now you can call your AngularJS code functions by way of the scope handle:
// we are in legacy code land here...
microappscope.sayHi();
microappscope.sayBye();
To make things more convenient, you can use a function to grab the scope handle anytime you want to access it:
function microappscope(){
return angular.element($("#MySuperAwesomeApp")).scope();
}
Your calls would then look like this:
microappscope().sayHi();
microappscope().sayBye();
You can see a working example here:
http://jsfiddle.net/peterdrinnan/2nPnB/16/
I also showed this in a slideshow for the Ottawa AngularJS group (just skip to the last 2 slides)
http://www.slideshare.net/peterdrinnan/angular-for-legacyapps
Greatest explanation of the concept I've found is situated here: https://groups.google.com/forum/#!msg/angular/kqFrwiysgpA/eB9mNbQzcHwJ
To save you the clicking:
// get Angular scope from the known DOM element
e = document.getElementById('myAngularApp');
scope = angular.element(e).scope();
// update the model with a wrap in $apply(fn) which will refresh the view for us
scope.$apply(function() {
scope.controllerMethod(val);
});
链接地址: http://www.djcxy.com/p/77550.html
下一篇: 从旧代码中调用AngularJS