Ayrı AngularJS kontrolör dosyaları nasıl oluşturulur?


315

Tüm AngularJS denetleyicilerim tek bir dosyada, controllers.js var. Bu dosya aşağıdaki şekilde yapılandırılmıştır:

angular.module('myApp.controllers', [])
  .controller('Ctrl1', ['$scope', '$http', function($scope, $http) {    
  }])
  .controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
  }])

Yapmak istediğim şey Ctrl1 ve Ctrl2'yi ayrı dosyalara koymak. Daha sonra her iki dosyayı da index.html dosyasına eklerdim, ancak bu nasıl yapılandırılmalıdır? Böyle bir şey yapmayı denedim ve web tarayıcısı konsolunda denetleyicilerimi bulamadığını söyleyen bir hata veriyor. İpucu var mı?

StackOverflow aradım ve bu benzer soruyu buldum - ancak, bu sözdizimi Angular üstünde farklı bir çerçeve (CoffeeScript) kullanıyor ve bu yüzden takip edemedim.


AngularJS: Birden fazla dosyada nasıl denetleyici oluştururum

Yanıtlar:


399

Birinci dosya:

angular.module('myApp.controllers', []);

İkinci dosya:

angular.module('myApp.controllers').controller('Ctrl1', ['$scope', '$http', function($scope, $http){

}]);

Üçüncü dosya:

angular.module('myApp.controllers').controller('Ctrl2', ['$scope', '$http', function($scope, $http){

}]);

Bu sırayla ekleyin. Modül bildirimi tek başına olacak şekilde 3 dosya öneririm.


Klasör yapısına gelince, konu hakkında çok fazla fikir var, ancak bu ikisi oldukça iyi

https://github.com/angular/angular-seed

http://briantford.com/blog/huuuuuge-angular-apps.html


1
OP, CoffeeScript sözdizimi ile ilgili karışıklık belirtiyorsa, cevabınızda kullanmamak belki de en iyisi olabilir mi?
Andrew

3
@ Ve gelecekteki yardım imhorew ve çözümler bir kaydı yapmak SO gerçekten ne olduğunu, exqporaneous q ve a değil.
Fresheyeball 10'14

2
@RuslanIsmagilov sizin appCtrlbir küresel window.appCtrl. Bu iyi bir uygulama değil.
Fresheyeball

1
@Fresheyeball, bu yaklaşımın sorunu index.html dosyasında içe aktarma sırasının önemli olduğu, aksi takdirde Açısal yayma hatası.
Deoxyseia

2
@hendryau, ben OP'de bulunan modül adıyla çalışıyordum. Bununla birlikte, bazıları, organizasyonel olarak, merkezi bir uygulama modülü yerine birden çok ad aralıklı modüle sahip olmanın daha iyi olduğunu düşünüyor.
Fresheyeball

177

Angular.module API'sini sonunda bir dizi ile kullanmak, açısalın yeni bir modül oluşturmasını söyler:

myApp.js

// It is like saying "create a new module"
angular.module('myApp.controllers', []); // Notice the empty array at the end here

Dizi olmadan kullanmak aslında bir getter işlevidir. Denetleyicilerinizi ayırmak için şunları yapabilirsiniz:

Ctrl1.js

// It is just like saying "get this module and create a controller"
angular.module('myApp.controllers').controller('Ctrlr1', ['$scope', '$http', function($scope, $http) {}]);

Ctrl2.js

angular.module('myApp.controllers').controller('Ctrlr2', ['$scope', '$http', function($scope, $http) {}]);

Javascript içe aktarmalarınız sırasında, myApp.js dosyasının AngularJS'den sonra olduğundan emin olun , ancak herhangi bir denetleyici / hizmet / vb. Önce ... aksi takdirde açısal denetleyicilerinizi başlatamaz.


bağımlılıklarımı nereye yazmalıyım. var myapp = angular.module ('demo', ['ngRoute', 'ngCookies', 'ui.bootstrap', 'nvd3ChartDirectives', 'ui-rangeSlider', 'textAngular', 'angularTreeview']);
vipin

@vipin yazdığınız gibi, ancak herhangi bir denetleyici, hizmet vb. üzerinde olduğundan emin olun. Teknik olarak var myapp = ... bildirmeniz gerekmez; çünkü açısal sizin için saklayacaktır.
Jimmy Au

@JimmyAu Sayfanın kullanabilmesi için Ctrl1.js ve Ctrl2.js nereye yüklenir? MyApp.js dosyasını açısaldan hemen sonra yükledim, ancak sayfa denetleyicileri bulamıyor. Bunları, ihtiyacı olan görünümde bir komut dosyası olarak açıkça eklemem gerekir mi? Yoksa yine de her sayfaya her kontrolör dosyasını dahil etmek zorunda mıyım?
Sinaesthetic

2
Neden yalnızca ilk aramanın [] gerektirdiğini açıkladığınız için teşekkür ederiz.
Jim

49

Her iki cevap teknik olarak doğru olsa da, bu cevap için farklı bir sözdizimi seçeneği sunmak istiyorum. Bu imho, enjeksiyonla neler olup bittiğini okumayı, aralarında ayrım yapmayı kolaylaştırır.

Birinci Dosya

// Create the module that deals with controllers
angular.module('myApp.controllers', []);

Dosya İki

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl1
// to the module we got in the line above
.controller('Ctrl1', Ctrl1);

// Inject my dependencies
Ctrl1.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl1($scope, $http) {
  // Logic here
}

Üç Dosya

// Here we get the module we created in file one
angular.module('myApp.controllers')

// We are adding a function called Ctrl2
// to the module we got in the line above
.controller('Ctrl2', Ctrl2);

// Inject my dependencies
Ctrl2.$inject = ['$scope', '$http'];

// Now create our controller function with all necessary logic
function Ctrl2($scope, $http) {
  // Logic here
}

İlginç, beni bir denetleyiciyi kaydetmek için birden fazla dosyaya gitmekten
alıkoyuyor

4
Bunun gibi bir sürü kodlama görüyorum. Avantajı nedir? $ enjekte ve ayrı bir fonksiyon olması.
Alaksandar Jesus Gene

2
Kodun okunmasını kolaylaştırdığını düşünüyorum. Tam olarak neyin enjekte edildiğini biliyorum. Bunu satır satır "endişelerin ayrılması" olarak düşünün.
jason328

2
Bunun gibi kodlar yalnızca daha okunabilir kod üretmekle kalmaz , hata ayıklama işleminin çok daha kolay olmasını sağlar ve iç içe geri arama kodunun miktarını azaltır (bkz. Github.com/johnpapa/angular-styleguide/blob/master/a1/… )
rfornal

1000 kez + 1'leyebilseydim, bravo!
Dan Chase

17

Bu çözüm ne olacak? Dosyalardaki Modüller ve Denetleyiciler (sayfanın sonunda) Birden fazla denetleyici, yönerge vb. İle çalışır:

app.js

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

myCtrl.js

app.controller("myCtrl", function($scope) { ..});

html

<script src="app.js"></script>
<script src="myCtrl.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">

Google'ın, bağlamlara göre gruplandırmayı gerçekten sevdiğim Açısal Uygulama Yapısı için En İyi Uygulama Önerileri de var . Tek bir klasördeki tüm html değil, örneğin oturum açma için tüm dosyalar (html, css, app.js, controller.js ve benzeri). Eğer bir modül üzerinde çalışırsam, tüm direktifleri bulmak daha kolaydır.


3

Kısacası, küresel değişkenlere dayanmayan bir ES2015 örneği

// controllers/example-controller.js

export const ExampleControllerName = "ExampleController"
export const ExampleController = ($scope) => {
  // something... 
}

// controllers/another-controller.js

export const AnotherControllerName = "AnotherController"
export const AnotherController = ($scope) => {
  // functionality... 
}

// app.js

import angular from "angular";

import {
  ExampleControllerName,
  ExampleController
} = "./controllers/example-controller";

import {
  AnotherControllerName,
  AnotherController
} = "./controllers/another-controller";

angular.module("myApp", [/* deps */])
  .controller(ExampleControllerName, ExampleController)
  .controller(AnotherControllerName, AnotherController)

1
Adlandırılmış işlevler kullandıysanız yazarak biraz tasarruf edebilirsiniz .. onlar kullanışlı özelliği name.. böylece sadece ExampleCtrl.namedupl yerine kullanabilirsiniz .. üçlü.
Antti Pihlaja

0

Çok zarif değil, ama uygulama çözümünde çok basit - küresel değişkeni kullanarak.

"İlk" dosyada:


window.myApp = angular.module("myApp", [])
....

"ikinci", "üçüncü" vb.


myApp.controller('MyController', function($scope) {
    .... 
    }); 

Bu kodu kullanın ama hala benim denetleyicisi yükleyemiyor? hata veriyor: Hata: [ng: areq] 'ProductCtrl' bağımsız değişkeni bir işlev değil, tanımsız.
QViet

7
Bu gerçekten kötü bir uygulama
Brendan

@Kim Jong Un Denetleyiciyi oluşturduğunuz modüle eklemez / birleştirmezseniz bu hatayı görürsünüz. Aşağıdaki sözdizimini kullanırsanız çalışır:angular.module('myApp').controller('ProductCtrl', ['$scope', '$http', function($scope, $http){ //Your ProductCtrl code goes here }]);
Devner

1
@Brendan, basitçe bir şeyin kötü bir uygulama olduğunu belirtmek hiçlikten iyidir - ama fazla değil. Bize neden kötü uygulamanın başkalarına yardımcı olacağını söyleyin .
Mawg, Monica'yı
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.