angularjs - Kuinka voin määrittää kontrollerini käyttämällä TypeScriptiä?
Kuinka määritellä kontrollerini käyttämällä TypeScriptiä. Tällä hetkellä se on AngularJS:ssä, mutta haluan muuttaa tämän TypeScriptiksi, jotta tiedot voidaan hakea nopeasti.
function CustomerCtrl($scope, $http, $templateCache){
$scope.search = function(search)
{
debugger;
var Search = {
AccountId: search.AccountId,
checkActiveOnly: search.checkActiveOnly,
checkParentsOnly: search.checkParentsOnly,
listCustomerType: search.listCustomerType
};
$scope.customer = [];
$scope.ticket = [];
$scope.services = [];
$http.put('<%=ResolveUrl("API/Search/PutDoSearch")%>', Search).
success(function(data, status, headers, config) {
debugger;
$scope.cust_File = data[0].customers;
$scope.ticket_file = data[0].tickets;
$scope.service_file = data[0].services;
}).
error(function(data, status)
{
console.log("Request Failed");
});
}
}
Vastaus #1
Tähän on kaksi erilaista tapaa:
- käytetään edelleen $scope
- käyttäen controllerAs (suositeltu)
käyttäen $scope
class CustomCtrl{
static $inject = ['$scope', '$http', '$templateCache'];
constructor (
private $scope,
private $http,
private $templateCache
){
$scope.search = this.search;
}
private search (search) {
debugger;
var Search = {
AccountId: search.AccountId,
checkActiveOnly: search.checkActiveOnly,
checkParentsOnly: search.checkParentsOnly,
listCustomerType: search.listCustomerType
};
this.$scope.customer = [];
this.$scope.ticket = [];
this.$scope.services = [];
this.$http.put('<%=ResolveUrl("API/Search/PutDoSearch")%>', Search).
success((data, status, headers, config) => {
debugger;
this.$scope.cust_File = data[0].customers;
this.$scope.ticket_file = data[0].tickets;
this.$scope.service_file = data[0].services;
}).
error((data, status) => {
console.log("Request Failed");
});
}
}
Käyttämällä controllerAs
class CustomCtrl{
public customer;
public ticket;
public services;
public cust_File;
public ticket_file;
public service_file;
static $inject = ['$scope', '$http', '$templateCache'];
constructor (
private $http,
private $templateCache
){}
private search (search) {
debugger;
var Search = {
AccountId: search.AccountId,
checkActiveOnly: search.checkActiveOnly,
checkParentsOnly: search.checkParentsOnly,
listCustomerType: search.listCustomerType
};
this.customer = [];
this.ticket = [];
this.services = [];
this.$http.put('<%=ResolveUrl("API/Search/PutDoSearch")%>', Search).
success((data, status, headers, config) => {
debugger;
this.cust_File = data[0].customers;
this.ticket_file = data[0].tickets;
this.service_file = data[0].services;
}).
error((data, status) => {
console.log("Request Failed");
});
}
}
Jos vaihdat $scope:sta controllerAs:iin, näkymäsi muuttuisi seuraavasti:
<div ng-controller="CustomCtrl">
<span>{{customer}}</span>
</div>
kohtaan :
<div ng-controller="CustomCtrl as custom">
<span>{{custom.customer}}</span>
</div>
missä custom on ohjaimen esitys, joten kerrot nimenomaisesti, mihin sitoudut merkinnässäsi.
Huomautus $inject on tapa antaa Angularille tietoa siitä, mitä riippuvuuksia sen pitäisi injektoida kontrolleriisi ajon aikana, jopa silloin kun koodi on minimoitu (merkkijonot eivät muutu minimoinnin yhteydessä)
Vastaus #2
Päätin lisätä toisen vastauksen, jossa on toimiva esimerkki. Se on hyvin yksinkertaistettu versio, mutta sen pitäisi näyttää kaikki perusasiat siitä, miten käyttää TypeScript ja angularJS.
On toimiva plunker
Tämä olisi meidän data.json, joka toimii palvelimen roolissa.
{
"a": "Customer AAA",
"b": "Customer BBB",
"c": "Customer DDD",
"d": "Customer DDD",
"Default": "Not found"
}
Tämä olisi aloitusmoduulimme MainApp.js:
var app = angular.module('MainApp', [
'CustomerSearch'
]);
angular.module('CustomerSearch',[])
Joten myöhemmin voimme käyttää moduulia CustomerSearch. Tämä olisi meidän index.html
<!DOCTYPE html>
<html ng-app="MainApp" ng-strict-di>
<head>
<title>my app</title>
<script data-require="angular.js@*"
src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.0-rc.1/angular.js"
></script>
<script src="MainApp.js"></script>
<script src="CustomerSearch.dirc.js"></script>
</head>
<body>
<customer-search></customer-search> // our directive
</body>
</html>
Nyt näemme 1) direktiivin, 2) laajuuden ja 3) ohjaimen määrittelyn. Kaikki tämä voisi olla yhdessä tiedostossa (katso se täältä). Tarkastellaan kaikkia kolmea osaa siitä tiedostosta CustomerSearch.dirc.js (se on CustomerSearch.dirc.ts .. mutta plunkeria varten käänsin sen)
1) hae viite yllä määriteltyyn moduuliin 'CustomerSearch' ja määrittele direktiivi
/// <reference path="../scripts/angularjs/angular.d.ts" />
module CustomerSearch
{
var app = angular.module('CustomerSearch');
export class CustomerSearchDirective implements ng.IDirective
{
public restrict: string = "E";
public replace: boolean = true;
public template: string = "<div>" +
"<input ng-model=\"SearchedValue\" />" +
"<button ng-click=\"Ctrl.Search()\" >Search</button>" +
"<p> for searched value <b>{{SearchedValue}}</b> " +
" we found: <i>{{FoundResult}}</i></p>" +
"</div>";
public controller: string = 'CustomerSearchCtrl';
public controllerAs: string = 'Ctrl';
public scope = {};
}
app.directive("customerSearch", [() => new CustomerSearch.CustomerSearchDirective()]);
Direktiivi määriteltiin TypeScriptissä ja injektoitiin välittömästi moduuliimme
Nyt määrittelemme skoopin käytettäväksi Controllerissa vahvasti tyypitettynä objektina:
export interface ICustomerSearchScope extends ng.IScope
{
SearchedValue: string;
FoundResult: string;
Ctrl: CustomerSearchCtrl;
}
Ja nyt voimme julistaa yksinkertaisen ohjaimen
export class CustomerSearchCtrl
{
static $inject = ["$scope", "$http"];
constructor(protected $scope: CustomerSearch.ICustomerSearchScope,
protected $http: ng.IHttpService)
{
// todo
}
public Search(): void
{
this.$http
.get("data.json")
.then((response: ng.IHttpPromiseCallbackArg<any>) =>
{
var data = response.data;
this.$scope.FoundResult = data[this.$scope.SearchedValue]
|| data["Default"];
});
}
}
app.controller('CustomerSearchCtrl', CustomerSearch.CustomerSearchCtrl);
}
Huomaa, että kaikki toimivat täällä
