Saya menggunakan template benih sudut untuk menyusun aplikasi saya. Awalnya saya memasukkan semua kode JavaScript saya ke dalam satu file main.js
,. File ini berisi deklarasi modul, pengontrol, arahan, filter, dan layanan saya. Aplikasi berfungsi dengan baik seperti ini, tetapi saya khawatir tentang skalabilitas dan pemeliharaan karena aplikasi saya menjadi lebih kompleks. Saya perhatikan bahwa templat benih sudut memiliki file terpisah untuk masing-masing, jadi saya telah mencoba mendistribusikan kode saya dari satu main.js
file ke masing-masing file lain yang disebutkan dalam judul pertanyaan ini dan ditemukan di app/js
direktori sudut template benih .
Pertanyaan saya adalah: bagaimana cara mengelola dependensi agar aplikasi berfungsi? Dokumentasi yang ada yang ditemukan di sini tidak terlalu jelas dalam hal ini karena masing-masing contoh yang diberikan menunjukkan satu file sumber JavaScript.
Contoh dari apa yang saya miliki adalah:
app.js
angular.module('myApp',
['myApp.filters',
'myApp.services',
'myApp.controllers']);
controllers.js
angular.module('myApp.controllers', []).
controller('AppCtrl', [function ($scope, $http, $filter, MyService) {
$scope.myService = MyService; // found in services.js
// other functions...
}
]);
filter.js
angular.module('myApp.filters', []).
filter('myFilter', [function (MyService) {
return function(value) {
if (MyService.data) { // test to ensure service is loaded
for (var i = 0; i < MyService.data.length; i++) {
// code to return appropriate value from MyService
}
}
}
}]
);
services.js
angular.module('myApp.services', []).
factory('MyService', function($http) {
var MyService = {};
$http.get('resources/data.json').success(function(response) {
MyService.data = response;
});
return MyService;
}
);
main.js
/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);
myApp.factory('MyService', function($http) {
// same code as in services.js
}
myApp.filter('myFilter', function(MyService) {
// same code as in filters.js
}
function AppCtrl ($scope, $http, $filter, MyService) {
// same code as in app.js
}
Bagaimana cara mengelola dependensi?
Terima kasih sebelumnya.
sumber
angular.module('myApp.services', ['myApp.services']);
ke app.js tanpa hasil.angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
.angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])
aslinya. Jika tidak, saya tidak akan menyertakan myApp.services sebagai dependensinya sendiri.Jawaban:
Masalahnya disebabkan karena Anda "mendeklarasikan" modul aplikasi Anda di semua file terpisah.
Seperti inilah tampilan deklarasi modul aplikasi (bukan deklarasi pasti adalah istilah yang tepat):
Ini adalah tugas (tidak yakin apakah tugas adalah istilah yang tepat) untuk modul aplikasi Anda terlihat seperti:
Perhatikan kurangnya tanda kurung siku.
Jadi, versi sebelumnya, yang memiliki tanda kurung siku, hanya boleh digunakan sekali, biasanya di
app.js
ataumain.js
. Semua file terkait lainnya - pengontrol, arahan, filter ... - harus menggunakan versi terakhir, yang tanpa tanda kurung siku.Saya harap itu masuk akal. Bersulang!
sumber
myApp
. Di file app.js saya, saya membuat var untuknyavar myApp = angular.module('myApp', []);
Di semua file lain, saya hanya merujuk ke var ini (misalnya,myApp.filter('myFilter', function(MyService) { /* filter code */ });
Selama saya menambahkan nama file dalam tag skrip di html saya, saya tidak perlu mendeklarasikan yang lain dependensi. Template proyek angular-seed cukup membingungkan dalam hal ini.myApp
, sehingga sekarang modul anonim diapp.js
:angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);
. Di semua file lain saya juga mendeklarasikan modul anonim seperti iniangular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });
. Aplikasi saya sekarang juga berfungsi seperti ini. Saya telah memeriksa riwayat kode saya dan saya tidak dapat melihat di mana perbedaan ini dengan apa yang saya lakukan ketika tidak berhasil.angular.module('myApp', []);
(perhatikan tanda kurung siku) di file js utama saya. Kemudian, semua file lainnya merujuk ke modul dengan menggunakan sintaksangular.module('myApp').controller
atau.directive
.ngCookies
,ngResource
) saat mendeklarasikan modul aplikasi utama Anda:angular.module('myApp', []);
ngResource
pasti salah satu yang Anda tempatkan di tanda kurung deklarasi modul Anda. Jika jawaban saya benar-benar membantu, memberikan suara dan menyetujuinya akan sangat dihargai.Jika Anda ingin meletakkan bagian yang berbeda dari aplikasi Anda (
filters, services, controllers
) di file fisik yang berbeda, ada dua hal yang harus Anda lakukan:app.js
atau di setiap file;Jadi, Anda
app.js
akan terlihat seperti ini:Dan di setiap file individual:
services.js
controllers.js
Semua ini dapat digabungkan menjadi satu panggilan:
controllers.jsBagian yang penting adalah Anda tidak harus mendefinisikan ulang
angular.module('myApp')
; yang akan menyebabkannya ditimpa saat Anda membuat instantiate pengontrol Anda, mungkin bukan yang Anda inginkan.sumber
Anda mendapatkan kesalahan karena Anda belum menentukan
myApp.services
. Apa yang saya lakukan sejauh ini adalah meletakkan semua definisi awal dalam satu file dan kemudian menggunakannya di file lain. Seperti contoh Anda, saya akan memasukkan:app.js
Itu harus menghilangkan kesalahan, meskipun saya pikir Anda harus membaca artikel Eduard Gamonal yang disebutkan di salah satu komentar.
sumber
angular.module('myApp.services', []);
ke file app.js saya. Tidak ada yang benar-benar mengatasi masalah saya.