yeniden açın ve önceden önyüklenmiş bir uygulamaya bağımlılıklar ekleyin


89

Zaten önyüklenmiş bir açısal modüle geç bağımlılık enjekte etmenin bir yolu var mı? Demek istediğim şu:

Site genelinde açısal bir uygulamam olduğunu varsayalım:

// in app.js
var App = angular.module("App", []);

Ve her sayfada:

<html ng-app="App">

Daha sonra, mevcut sayfanın ihtiyaçlarına göre mantık eklemek için uygulamayı yeniden açıyorum:

// in reports.js
var App = angular.module("App")
App.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

Şimdi, (gibi mantık bu talebe bit bu bir de kendi bağımlılıkları gerektirir ki ngTouch, ngAnimate, ngResource, vs). Bunları temel uygulamaya nasıl ekleyebilirim? Bu işe yaramıyor gibi görünüyor:

// in reports.js
var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped

Her şeyi önceden yapabileceğimin farkındayım, yani -

// in app.js
var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]);

Veya her modülü kendi başına tanımlayın ve ardından her şeyi ana uygulamaya enjekte edin ( daha fazlası için buraya bakın ):

// in reports.js
angular.module("Reports", ['ui.event', 'ngResource'])
.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

// in home.js
angular.module("Home", ['ngAnimate'])
.controller("HomeController", ['$scope', '$http', function($scope, $http){
  // ...
}])

// in app.js, loaded last into the page (different for every page that varies in dependencies)
var App = angular.module("App", ['Reports', 'Home'])

Ancak bu, Uygulamayı her seferinde mevcut sayfanın bağımlılıkları ile başlatmamı gerektirecektir.

Ben temel eklemeyi tercih app.jsher sayfada ve sadece her sayfasında (gerekli uzantıları tanıtmak reports.js, home.jsben eklemek önyükleme mantık her şey ya kaldır şey revize etmek zorunda kalmadan, vs.).

Uygulama zaten önyüklendiğinde bağımlılıklar oluşturmanın bir yolu var mı? Bunu yapmanın deyimsel yolu (veya yolları) nedir? İkinci çözüme yöneliyorum, ancak anlattığım yolun da yapılıp yapılamayacağını görmek istedim. Teşekkürler.


Bir göz atmak için bana son çalışma kodunu verebilir misin?
Mangu Singh Rajpurohit

@ user2393267 mmm, çok uzun zaman oldu, hala o koda sahip olup olmadığımı bilmiyorum ... Üzgünüm. Sanırım sonunda tasarımı yeniden gözden geçirdim, çünkü genellikle bir şeyleri kesmek zorunda kaldığımda bu, doğru yapmadığım anlamına gelir ... Ancak, hala bu yaklaşımı sürdürmeye kararlıysanız, aşağıdaki cevap iyi bir ipucu gibi görünüyor .
sa125

Yanıtlar:


115

Bunu şu şekilde çözdüm:

uygulamaya tekrar referans verin:

var app = angular.module('app');

ardından yeni gereksinimlerinizi gereksinimler dizisine aktarın:

app.requires.push('newDependency');

3
Bu benim için çalışıyor +1 Bunu app.requires.push ('doctorCtrl', 'doctorService') gibi çoklu bağımlılık için kullandım;
Amir

8
Bu benim mimarimi kurtardı.
Saeed Neamati

3
Benim için çalışmıyor. Bağımlılığı açıklandığı gibi dinamik olarak ekliyorum, ancak Angular hala eklenen modülden bir hizmet bulamıyor.
Slava Fomin II

6
Ve app.requiresEklediğiniz eğer öyleyse, bir dizidir birden (Raporlar örnekte olduğu gibi) bağımlılıkları, sen ayrı argümanlar olarak geçmek push: yöntemle app.requires.push('ui.event', 'ngResource');sizin ek bağımlılıkları zaten bir dizi ise veya:Array.prototype.push.apply(app.requires, ['ui.event', 'ngResource'])
The Red Bezelye

2
Bazen oylamayı atlıyorum çünkü bu sefer giriş yapmak istemiyorum! Teşekkürler!
CularBytes

12

Basit ... Alıcıyı şu şekilde kullanarak modülün bir örneğini alın: var app = angular.module ("Uygulama");

Sonra "gerektirir" koleksiyonuna şu şekilde ekleyin: app.requires [app.requires.length] = "ngResource";

Neyse, bu benim için çalıştı. İYİ ŞANSLAR!


4
Bu benim için çalıştı! Bir sorum var - neden kullanmıyorum: app.requires.push ("ngResource")?
Philipp Munin


4

Aynı anda birden fazla bağımlılık eklemek isterseniz, bunları aşağıdaki şekilde iletebilirsiniz:

<script>
    var app = angular.module('appName');
    app.requires.push('dependencyCtrl1', 'dependencyService1');
</script>

4

Bunun eski bir soru olduğunun farkındayım, ancak henüz işe yarayan bir cevap verilmedi, bu yüzden nasıl çözdüğümü paylaşmaya karar verdim.

Çözüm, çatal açmayı gerektirir, bu nedenle artık CDN kullanamazsınız. Ancak değişiklik çok küçük, bu yüzden bu özelliğin neden Angular'da bulunmadığına şaşırıyorum.

Bu soruya verilen diğer cevaplardan birinde verilen google gruplarının bağlantısını takip ettim . Orada sorunu çözen aşağıdaki kodu buldum:

instanceInjector.loadNewModules = function (mods) {
  forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); });
};

Bu kodu açısal 1.5.0 kaynak kodunda ( createInjectorfonksiyonun içinde , return instanceInjector;ifadeden önce ) 4414. satıra eklediğimde , bu şekilde önyüklemeden sonra bağımlılıklar eklememi sağladı $injector.loadNewModules(['ngCookies']);.


? En yüksek oyu alan yanıtın nesi var (6/26/2017 itibarıyla) ? Bunu göndermenizden bir yıldan fazla bir süre önce sağlanmış gibi görünüyor; Cevabınızın bir avantajı var mı?
The Red Pea

@TheRedPea Pekala, sorunumu çözmediği dışında bunda yanlış bir şey yok, ama bu cevap çözdü
tjespe

Ve sizin için işe yaramadı çünkü sanırım uygulamanızı zaten başlatmıştınız? Bunu ben de gözlemledim ...
The Red Pea

2
Bağlantılı Google Topluluğu gönderisini okuduktan sonra, bunun gibi bir çözümün gerekli olmasının nedeninin önyükleme olduğundan daha da eminim. Olumlu oylama, çünkü orijinal soru, başka hiç kimsenin ele almadığı "zaten önyüklenmiş bir uygulama" hakkında soru sordu (gerçekten de OP yanlış konuşmuş olabilir)
The Red Pea

1

1.6.7 sürümünden bu yana, uygulama kullanılarak başlatıldıktan sonra modülleri geç yüklemek artık mümkün $injector.loadNewModules([modules]). Aşağıda AngularJS belgelerinden alınan bir örnek verilmiştir:

app.factory('loadModule', function($injector) {
   return function loadModule(moduleName, bundleUrl) {
     return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });
   };
})

Etrafında bazı sorunlar olduğundan, lütfen loadNewModules hakkındaki tüm belgeleri okuyun .

Omkadiri'nin ui yönlendiriciyle kullanan çok iyi bir örnek uygulaması da var .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.