私はこれが古い質問であることを知っていますが、最近これを行うためのオプションを探していたので、誰かに役立つ場合に備えて、ここに私の調査結果を入れようと思いました。
ほとんどの場合、UIの状態またはアプリケーションの内部動作と対話する外部のレガシーコードが必要な場合、サービスはこれらの変更を抽象化するのに役立ちます。外部コードが角度コントローラー、コンポーネント、またはディレクティブと直接やり取りしている場合は、アプリをレガシーコードと強く結び付けています。これは悪いニュースです。
私の場合、最終的に使用したのは、ブラウザーでアクセス可能なグローバル(つまり、window)とイベント処理の組み合わせです。私のコードには、フォームを開始するためにCMSからのJSON出力を必要とするスマートフォーム生成エンジンがあります。これが私がやったことです:
function FormSchemaService(DOM) {
var conf = DOM.conf;
// This event is the point of integration from Legacy Code
DOM.addEventListener('register-schema', function (e) {
registerSchema(DOM.conf);
}, false);
// service logic continues ....
フォームスキーマサービスは、予想どおりに角度インジェクターを使用して作成されます。
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
そして私のコントローラーでは:function(){'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
これまでのところ、これは純粋な角度のあるJavaScriptサービス指向プログラミングです。しかし、レガシー統合はここにあります:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
明らかに、どのアプローチにもメリットとデメリットがあります。このアプローチの利点と使用法は、UIによって異なります。私のフォームスキーマとレガシーコードには角度スコープの制御と知識がないため、以前に提案されたアプローチは私の場合は機能しません。したがって、に基づいてアプリを構成angular.element('element-X').scope();
すると、スコープを変更するとアプリが壊れる可能性があります。しかし、もしあなたのアプリがスコープについての知識を持っていて、それが頻繁に変更されないことに依存できるなら、以前に提案されたことは実行可能なアプローチです。
お役に立てれば。フィードバックも歓迎します。
var injector = angular.injector(['ng', 'MyApp']);
ます。これを行うと、完全に新しいコンテキストと複製が得られますmyService
。つまり、サービスとモデルの2つのインスタンスが作成され、間違った場所にデータが追加されることになります。代わりに、を使用してアプリ内の要素をターゲットにする必要がありますangular.element('#ng-app').injector(['ng', 'MyApp'])
。この時点で、$ applyを使用してモデルの変更をラップできます。