2013-07-30 7 views
11

1つのページアプリケーションで角を使用していませんが、ロードオーダーの問題のためにメインアプリケーションモジュールを1回定義したいと思います。同時に私はすべてのJSファイルがすべてのページにロードされるわけではないので、ページ単位でモジュールを注入/要求したいと思います。 = angular.moduleオンザフライメインモジュールにモジュールを挿入する方法

アプリケーション(「アプリ」、[])

、それらをコントローラから、または後の段階で注入した:

はノー必要なモジュールとアプリケーションを定義することはできますか?

答えて

7

いいえ、現時点で正式にはサポートされていません。すべてのモジュールは、AngularJSアプリケーションがブートストラップされる前に、ブラウザにロードされ(メインアプリケーションモジュールの依存として宣言されている)必要があります。

+0

に含まれるように、ここで我々は、手動でアプリケーションをブートストラップしているあなたがに」言った:

はapp.jsからオンザフライでmyModule.jsが

var mainHead = document.getElementsByTagName('HEAD').item(0); var myScript= document.createElement("script"); myScript.type = "text/javascript"; mainHead.appendChild(myScript); myScript.src='../myModule.js'; myScript.onload = function(){ angular.element(document).ready(function() { angular.bootstrap(document, ['myngapp']); }); } 

注含めます瞬間"。将来は可能になるのだろうか? – Cherniv

+0

私は瞬間の拍手の中で、別の答えに投稿しましたが、pkozlowskiの入力が本当に好きです。 –

22

あなたの質問を読んで、私の頭の上にない、私は考えられる解決策/ハックを考えることができます。

アイデアはどのモジュールが含まれている前に、依存関係の配列を定義し、各モジュールの中でそれに追加することです:

// before anything else 
window.loadedDependencies = []; 

// at the end of each module file: 
window.loadedDependencies.push('moduleName') 

// after all that, at the app definition: 
app = angular.module("app", loadedDependencies) 

正直なところでは、私は本当にどんな意味合い/合併症を考慮されていないことこのメソッドは、私が(スクリプトファイルの呼び出しが少なく、キャッシングがあなたのユースケースに適していないのはなぜですか?)まで、これを暗示することはできません。

+0

これは、複数のSPAサイロからなるサイトに最適なアプローチです – jltrem

+0

これは、実際にどのような角が来たかをはるかに優れた解決策です。 1ページおきにすべてのページにモジュールを読み込むのは難しいようです。この方法で各ページはモジュールの依存関係を定義できます。 –

6

Tiagoの素晴らしいアイデア(upvote him!私は私のモジュールで次のようにしています:

window.dependencies = _.union(window.dependencies || [], [ 
    "ngRoute", 
    "app.mymodule1" 
]); 

angular 
    .module("app.mymodule1", []) 
    .config(["$routeProvider", function ($routeProvider) { 
     // more code 
    }]); 
私の app.js

と、この:

私はLoDashを使用するので、私はユニークな値の配列を取得するには、依存関係を union
var app; 

window.dependencies = _.union(window.dependencies || [], [ 
    "ngRoute", 
    "app.anothermodule" 
]); 

window.app = app = angular.module("app", window.dependencies); 

- 私のモジュールのいくつかはapp.jsと同じ依存関係を使用して、例えばngRoute。魔法のように

<!-- scripts from other pages/modules included here --> 

<script src="/js/anothermodule/anothermodule.js"></script> 
<script src="/js/app.js"></script> 

作品:

私のスクリプトは、このようなbodyタグの外観の下部に含まれています!

マイページは「マスター」ページを共有しますが、自分のファイルにモジュール定義があるため、このようなものが必要でした。

+1

@sonicSoul arr.concat(arr1)は、それらを一意にマージしません(2つの配列を組み合わせるためにアンダースコアを必要としません)。(window.dependecies ||)concat(['module1'、 'module2']) –

+1

@SonicSoul arr.concat 。既に含まれている依存関係も含まれます。例えばvar arr = ['a'、 'b']、arr1 = ['c'、 'd'、 'a']; ---- arr.concat(arr1) - >は['a'、 'b'、 'c'、 'd'、 'a']を返します。 – sheelpriy

0

私はそれが次のことについて非常に美しいが、何ではないことを知っている:

var injectedDependencies = [.....]; 
angular.prevmodule = angular.module; 
angular.module = function(name, params){ 
    if(params){ 
     params.push(injectedDependencies); 
    } 
    return angular.prevmodule.apply(angular, arguments); 
} 

編集:あなたはアプリがロギング用exapmpleため(それらを知らなくても、モジュールを挿入したい場合は、これが便利であることに注意してください、モニタリング、セキュリティなど)を提供しますが、アプリケーションがブートストラップされた後にインジェクトする場合は必要ありません。

0

私は同じ問題を抱えています。 私はhttp://blog.getelementsbyidea.com/load-a-module-on-demand-with-angularjs/があなたが望むことをするかもしれないと思います。そのgithubのhttps://github.com/ocombe/ocLazyLoad

を探すことが出来ます:

  1. 注入された唯一のアプリがAppCtrl.jshttps://github.com/ocombe/ocLazyLoad/blob/master/examples/example1/js/app.js#L24
  2. AppCtrl.js後で実行時の荷重グリッドhttps://github.com/ocombe/ocLazyLoad/blob/master/examples/example1/js/AppCtrl.js#L28(およびasynchrously をロードしているアプリhttps://github.com/ocombe/ocLazyLoad/blob/master/examples/example1/index.html#L2
  3. アプリであること)! voi'laは

これは少し複雑に見えるかもしれませんが、あなたは、実行時にそれらをロード中に本当に興味を持っている場合、これは、手動で手動_invokeQueueをmodyfing除いて、唯一の解決策かもしれません。

3

我々はmyModule.js

app.requires.push('app.myModule'); 

とあなたのindex.html内でapp.requires

//app.js 
    var app = angular.module('myngapp',['ngRoute','ngCookies','ui.bootstrap','kendo.directives','pascalprecht.translate','tmh.dynamicLocale']); 

    app.config(['$routeProvider', '$httpProvider', '$translateProvider', 'tmhDynamicLocaleProvider', '$compileProvider', function($routeProvider, $httpProvider, $translateProvider, tmhDynamicLocaleProvider, $compileProvider) { 
    'use strict'; 

    $compileProvider.debugInfoEnabled(false); 

    $routeProvider.otherwise({ 
     redirectTo: '/login' 
    }); 
    }]); 

を使用してそれを達成することができ、次のapp.js最初とmyModule.jsが含まれます。このようにして、app.jsを変更せずにn個のモジュールを含めることができます。動的にロードされたモジュールはまた、我々のアプリケーション

+0

こんにちはtk、この質問をご覧ください、私はあなたが記述した方法に従っています - http://stackoverflow.com/questions/42111131/dynamically-inject-angular-modules-as-dependency – codeomnitrix

+0

ありがとう! app.requires.push( 'moduleName');完璧に働いた! –