AngularJS
Używanie AngularJS z TypeScript
Szukaj…
Składnia
- $ scope: ng.IScope - jest to sposób w maszynopisie do zdefiniowania typu dla konkretnej zmiennej.
Kontrolery kątowe w maszynopisie
Zgodnie z definicją w dokumentacji AngularJS
Kiedy kontroler jest podłączony do DOM za pomocą dyrektywy ng-controller, Angular utworzy instancję nowego obiektu kontrolera, używając określonej funkcji konstruktora kontrolera. Nowy zakres potomny zostanie utworzony i udostępniony jako parametr do wstrzyknięcia funkcji konstruktora Kontrolera jako $ scope.
Kontrolery można bardzo łatwo tworzyć za pomocą klas maszynopisu.
module App.Controllers {
class Address {
line1: string;
line2: string;
city: string;
state: string;
}
export class SampleController {
firstName: string;
lastName: string;
age: number;
address: Address;
setUpWatches($scope: ng.IScope): void {
$scope.$watch(() => this.firstName, (n, o) => {
//n is string and so is o
});
};
constructor($scope: ng.IScope) {
this.setUpWatches($scope);
}
}
}
Wynikowy Javascript to
var App;
(function (App) {
var Controllers;
(function (Controllers) {
var Address = (function () {
function Address() {
}
return Address;
}());
var SampleController = (function () {
function SampleController($scope) {
this.setUpWatches($scope);
}
SampleController.prototype.setUpWatches = function ($scope) {
var _this = this;
$scope.$watch(function () { return _this.firstName; }, function (n, o) {
//n is string and so is o
});
};
;
return SampleController;
}());
Controllers.SampleController = SampleController;
})(Controllers = App.Controllers || (App.Controllers = {}));
})(App || (App = {}));
//# sourceMappingURL=ExampleController.js.map
Po utworzeniu klasy kontrolera pozwól, aby moduł kątowy js dotyczący kontrolera mógł być wykonany w prosty sposób za pomocą klasy
app
.module('app')
.controller('exampleController', App.Controller.SampleController)
Używanie kontrolera ze składnią ControllerAs
Sterownik, który stworzyliśmy, może zostać utworzony i użyty przy użyciu controller as Składni. To dlatego, że umieściliśmy zmienną bezpośrednio w klasie kontrolera, a nie w zakresie $scope .
Używanie controller as someName ma na celu oddzielenie kontrolera od samego $scope , więc nie ma potrzeby wstrzykiwania $ scope jako zależności w kontrolerze.
Tradycyjny sposób :
// we are using $scope object.
app.controller('MyCtrl', function ($scope) {
$scope.name = 'John';
});
<div ng-controller="MyCtrl">
{{name}}
</div>
Teraz z controller as składnią :
// we are using the "this" Object instead of "$scope"
app.controller('MyCtrl', function() {
this.name = 'John';
});
<div ng-controller="MyCtrl as info">
{{info.name}}
</div>
Jeśli tworzysz „klasę” w JavaScript, możesz to zrobić:
var jsClass = function () {
this.name = 'John';
}
var jsObj = new jsClass();
Tak więc teraz możemy użyć instancji jsObj aby uzyskać dostęp do dowolnej metody lub właściwości jsClass .
W angular robimy to samo. Używamy kontrolera jako składni do tworzenia instancji.
Korzystanie z pakietowania / minimalizacji
Sposób, w jaki zakres $ jest wstrzykiwany w funkcje konstruktora kontrolera, jest sposobem na zademonstrowanie i wykorzystanie podstawowej opcji wstrzykiwania zależności kątowej, ale nie jest on gotowy do produkcji, ponieważ nie można go zminimalizować. Jest tak, ponieważ system minimalizacji zmienia nazwy zmiennych, a wstrzykiwanie zależności anguara wykorzystuje nazwy parametrów, aby wiedzieć, co należy wstrzyknąć. Na przykład funkcja konstruktora ExampleController jest zminimalizowana do następującego kodu.
function n(n){this.setUpWatches(n)
a $scope zmieniono na n !
aby temu zaradzić, możemy dodać tablicę $ inject ( string[] ). Tak, że DI angulara wie, co wstrzyknąć w jakiej pozycji jest funkcja konstruktora kontrolerów.
Powyższy maszynopis zmienia się na
module App.Controllers {
class Address {
line1: string;
line2: string;
city: string;
state: string;
}
export class SampleController {
firstName: string;
lastName: string;
age: number;
address: Address;
setUpWatches($scope: ng.IScope): void {
$scope.$watch(() => this.firstName, (n, o) => {
//n is string and so is o
});
};
static $inject : string[] = ['$scope'];
constructor($scope: ng.IScope) {
this.setUpWatches($scope);
}
}
}
Dlaczego składnia ControllerAs?
Funkcja kontrolera
Funkcja kontrolera to po prostu funkcja konstruktora JavaScript. Dlatego gdy widok ładuje się, function context ( this ) jest ustawiany na obiekt kontrolera.
Przypadek 1 :
this.constFunction = function() { ... }
Jest tworzony w controller object , a nie w $scope . widoki nie mają dostępu do funkcji zdefiniowanych w obiekcie kontrolera.
Przykład:
<a href="#123" ng-click="constFunction()"></a> // It will not work
Przypadek 2:
$scope.scopeFunction = function() { ... }
Jest tworzony w obiekcie $scope object , a nie w controller object . widoki mogą uzyskać dostęp tylko do funkcji zdefiniowanych w obiekcie $scope .
Przykład:
<a href="#123" ng-click="scopeFunction()"></a> // It will work
Dlaczego ControllerAs?
Składnia
ControllerAssprawia, że znacznie łatwiej jest manipulowaćoneCtrl.nameanotherCtrl.nameoneCtrl.nameianotherCtrl.nameznacznie łatwiej jest stwierdzić, że masznameprzypisaną przez wiele różnych kontrolerów do różnych celów, ale jeśli oba używały tego samego$scope.namei posiadały dwa różne elementy HTML na stronie, które są powiązane z{{name}}wtedy trudno jest ustalić, który jest z którego kontrolera.Ukrywanie
$scopei narażanie członków przed kontrolerem na widok zaintermediary object. Ustawiającthis.*, Możemy ujawnić tylko to, co chcemy odsłonić od kontrolera do widoku.<div ng-controller="FirstCtrl"> {{ name }} <div ng-controller="SecondCtrl"> {{ name }} <div ng-controller="ThirdCtrl"> {{ name }} </div> </div> </div>
Tutaj, w powyższym przypadku {{ name }} będzie bardzo mylące w użyciu, a także nie wiemy, który z nich jest powiązany z którym kontrolerem.
<div ng-controller="FirstCtrl as first">
{{ first.name }}
<div ng-controller="SecondCtrl as second">
{{ second.name }}
<div ng-controller="ThirdCtrl as third">
{{ third.name }}
</div>
</div>
</div>
Dlaczego zakres?
- Użyj
$scopegdy potrzebujesz dostępu do jednej lub więcej metod $ scope, takich jak$watch,$digest,$emit,$httpitp. - ograniczyć, które właściwości i / lub metody są narażone na
$scope, a następnie jawnie przekazując je do$scopew razie potrzeby.