2014-11-18 11 views
17

Wissen Sie, ob es möglich ist, eine Modulabhängigkeit hinzuzufügen, nachdem sie erstellt wurde? Etwas wie das:Hinzufügen einer Abhängigkeit zum angularen Modul, nachdem es erstellt wurde

// init module in file A 
angular.module("myApp", []); 

// retrieve module in file B and add new dependencies: 
mod = angular.module("myApp"); 
// now I want to add an 'ngResource' dependency to mod 
// ??? 

EDIT: Ich verstehe, dass dies eine seltsame Frage scheint. Ich arbeite an einer komponentenbasierten App-Organisation und möchte auch sehen, ob eine Unterkomponente dem übergeordneten Komponentenmodul Abhängigkeiten hinzufügen kann, ohne ein eigenes Modul zu definieren. So etwas Ähnliches:

app/ 
components/ 
    |__componentA/ 
     |__app.js // initializes component A module 
     |__subcomponentA/ 
       |__app.js // want to add subcomponentA dependencies to componentA module from here 

Meine Alternative ist einfach erklären all subcomponentA Abhängigkeiten direkt auf dem Modul Komponente A, sondern von Organisation Sicht, würde ich es vorziehen, diese Abhängigkeiten innerhalb des subcomponentA Verzeichnisses zu halten, so dass, wenn ich später entscheiden Um die Subkomponente A aus der App zu entfernen, muss ich nicht daran denken, ihre Abhängigkeiten vom Modul componentA zu entfernen. Ich möchte, dass alles, was Subkomponente A betrifft, im Verzeichnis subcomponentA gruppiert wird. Mein Build-Skript stellt sicher, dass componentA-Code vor dem SubcomponetA verarbeitet wird.

Vielen Dank an alle, die einen Stich machen.

Antwort

0

Ich glaube nicht, dass das möglich ist. Allerdings würde ich gerne falsch bewiesen werden.

Aus meiner Erfahrung (und entsprechend der Angular documentation) Modulabhängigkeiten können nur bei der Initialisierung eines Moduls deklariert werden. Es ist erwähnenswert, dass bis zum Start der Anwendung die Abhängigkeiten nicht vollständig festgelegt sind. Soweit ich weiß, ist es nicht möglich, Abhängigkeiten zu einer laufenden Anwendung hinzuzufügen, es sei denn, es gibt eine Möglichkeit, die gesamte App neu zu starten, was sowieso unerwünschte Nebenwirkungen haben kann.

Edit: Eigentlich .... Ich habe das nie versucht, aber das könnte tatsächlich viel einfacher als ich ursprünglich dachte. Wir könnten versuchen Sie folgendes:

Datei A:

window.myApp_dependencies = []; // Add dependencies to the global scope. 

angular.module('myApp', dependencies); 

Datei B:

var mod = angular.module("myApp"); 

window.myApp_dependencies.push('ngRoute'); 

Das ist nicht wirklich ideal, da Sie eine Variable im globalen Rahmen zu schaffen, sind gezwungen. Es wäre jedoch möglich, dies mit Modulen zu tun. Beachten Sie, dass in diesem Fall die Abhängigkeiten nur änderbar sind, bis die App tatsächlich gestartet wurde. Sie können also Abhängigkeiten zwischen Dateien aufteilen, aber Sie können diese zur Laufzeit nicht ändern.

Ich weiß nicht, ob das funktioniert. Ich werde es morgen ausprobieren.

+2

So hat es funktioniert? –

+0

Es funktioniert, ich habe es gerade versucht mit Angular 1.5.0 – Stan

-2

seltsame Frage, aber nach wie vor, was Sie versuchen, in Aussicht etwas falsch von AngularJS zu erreichen/SPA/Dependency Injection

Ihr Anwendungsfall ist etwas, wie Sie will diese Abhängigkeit in einem bestimmten Modul verwenden, oder auf einer Seite. Deshalb möchten Sie es in einer Position und nicht in der anderen injizieren.

Aber tun dies zwei verschiedene Bereiche für Ihre Anwendung becuase mit demselben Namen des Moduls machen würde, wenn Sie das Modul reinitiallized, die anders sein würde, dass der andere die bereits

erklärt

sagen: Datei Eine

angular.module("myApp", []); 

Dies wird definiert und in der Datei B

mod = angular.module("myApp", ['ngResource']); 

würde dies so führt zwei verschiedene App mit dem gleichen Namen in einer ap hat Plication und diese zwei App mit dem gleichen Namen in verschiedenen Dateien so ist es etwas wie zwei verschiedene eckige Modul innen auf Anwendung haben.

Zweite Option: Lassen Sie das gleiche Modul über die Anwendung und injizieren Sie an einem Punkt und in jedem Controller, den Sie verwenden möchten, injizieren, dass als ein Argument in diesem Controller.

Hoffe diese Hilfe!

24

Ich benutze die folgende Methode für diese und funktioniert gut für mich.

var app = angular.module("myApp", []); 

angular.module("myApp").requires.push('ngResource'); 
+0

Getestet und funktioniert https://jsfiddle.net/cattails27/6mcck6pp/. Zu meiner Überraschung, wenn dies existiert, beseitigt dies die Notwendigkeit für unordentliche Sortierung von eckigen Modulen ... – jkris

+0

Welche Version von eckigen verwendeten Sie? –

+0

@SQLandJavaLearner In der Datei verwendet er die Angular Version 1.4.8 – Necroqubus

Verwandte Themen