SlideShare a Scribd company logo
AngularJS Warsaw #4 - Dariusz Kalbarczyk "Controller as"
Czysty kod - "Controller as" w
obronie kanciastego.
Dariusz Kalbarczyk
2015-10-22
Dziękuję za to że jesteście z nami dzisiaj.
Co ja tutaj robię ;)
http://goo.gl/ZFvbc8 http://goo.gl/9OUbV7
Angular Module
Angular Module
Config
Routs
View Controllers
Directives Factories
$scope
Kontroler – JavaScript’owy konstruktor
// JavaScript Constructor
function Car(){
this.model = 'RANGE ROVER';
this.price = 300000;
this.engine = '3.0 V6'
}
// za każdym razem kiedy otwieramy kontroler, tworzymy nową instancję
var sale = new Car();
Klasyczne wywołanie kontrolera
angular
.module('app.cars')
.controller('Car', Car);
function Car($scope){
$scope.model = 'RANGE ROVER';
$scope.price = 300000;
$scope.engine = '3.0 V6';
}
$scope
Składnia - Controller As
angular
.module('app.cars')
.controller('Car', Car);
function Car(){
var vm = this;
vm.model = 'RANGE ROVER';
vm.price = 300000;
vm.engine = '3.0 V6';
}
vm = this
$scope vs VM
angular
.module('app.cars')
.controller('Car', Car);
function Car($scope){
console.log('scope ',$scope);
};
$scope vs VM
angular
.module('app.cars')
.controller('Car', Car);
function Car(){
var vm = this;
console.log('vm ', vm);
};
$scope
• $id
• $apply
• $digest
• $watch
• $broadcast
• $destroy
• $emit
• $eval
$scope
• $new
• $on
• $parnet
• $root
• $watchCollection
• $evalAsync
• …
Zagnieżdżanie kontrolerów
<div ng-controller="Ctrl1">
{{test}}
<div ng-controller="Ctrl2">
{{test}}
<div ng-controller="Ctrl3">
{{test}}
</div>
</div>
</div>
Która wartość
zostanie
wyświetlona?
Bardziej czytelnie
<div ng-controller="Ctrl1">
{{ctrl1.test}}
<div ng-controller="Ctrl2">
{{ctrl2.test}}
<div ng-controller="Ctrl3">
{{ctrl3.test}}
</div>
</div>
</div>
Co się stanie?
<div ng-controller="Ctrl1">
Ctrl1: {{test}}
<div ng-controller="Ctrl2">
Ctrl2: {{test}}
<div ng-controller="Ctrl3">
Ctrl3: {{test}}
</div>
</div>
</div>
Co się stanie?
(function () {
angular
.module('app', []).controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2).controller('Ctrl3', Ctrl3);
Ctrl1.$inject = ['$scope'];
function Ctrl1($scope) { $scope.test="test 1"}
Ctrl2.$inject = ['$scope'];
function Ctrl2($scope) {}
Ctrl3.$inject = ['$scope'];
function Ctrl3($scope) {}
})();
Otrzymamy
Ctrl1: test 1
Ctrl2: test 1
Ctrl3: test 1
Co się stanie?
(function () {
angular
.module('app', []).controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2).controller('Ctrl3', Ctrl3);
Ctrl1.$inject = ['$scope'];
function Ctrl1($scope) {}
Ctrl2.$inject = ['$scope'];
function Ctrl2($scope) {}
Ctrl3.$inject = ['$scope'];
function Ctrl3($scope) {$scope.test="test 3"}
})();
Otrzymamy
Ctrl1:
Ctrl2:
Ctrl3: test 3
Dzieci chętnie korzystają z zasobów
rodziców, odwrotnie to nie działa, trochę
tak jak w życiu ;)
Controller As
<div ng-controller="Ctrl1 as vm">
Ctrl1: {{vm.test}}
<div ng-controller="Ctrl2 as vm">
Ctrl2: {{vm.test}}
<div ng-controller="Ctrl3 as vm">
Ctrl3: {{vm.test}}
</div>
</div>
</div>
Co się stanie?
(function () {
angular
.module('app', [])
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3);
Ctrl1.$inject = ['$scope'];
function Ctrl1($scope) { $scope.vm={ test : 'test 1' } };
Ctrl2.$inject = ['$scope'];
function Ctrl2($scope) {}
Ctrl3.$inject = ['$scope'];
function Ctrl3($scope) {}
})();
Otrzymamy
Ctrl1: test 1
Ctrl2:
Ctrl3:
Controller As bez $scope
<div ng-controller="Ctrl1 as vm">
Ctrl1: {{vm.test}}
<div ng-controller="Ctrl2 as vm">
Ctrl2: {{vm.test}}
<div ng-controller="Ctrl3 as vm">
Ctrl3: {{vm.test}}
</div>
</div>
</div>
Gdzie jest $scope?
(function () {
angular
.module('app', [])
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3);
function Ctrl1() {}
function Ctrl2() { var vm = this; vm.test = 'test 2';}
function Ctrl3() {}
})();
Otrzymamy
Ctrl1:
Ctrl2: test 2
Ctrl3:
Nie ma $scope a jednak działa i nie jest to
Angular2
Czy można bardziej czytelnie?
<div ng-controller="Ctrl1 as ctrl1">
Ctrl1: {{ctrl1.test}}
<div ng-controller="Ctrl2 as ctrl2">
Ctrl2: {{ctrl2.test}}
<div ng-controller="Ctrl3 as ctrl3">
Ctrl3: {{ctrl3.test}}
</div>
</div>
</div>
Podmieniamy vm na nazwę kontrolera
Ale nic nie zmieniamy w kodzie JavaScript!
(function () {
angular
.module('app', [])
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3);
function Ctrl1() {}
function Ctrl2() { var vm = this; vm.test = 'test 2';}
function Ctrl3() {}
})();
Tu nadal pozostaje vm
ctrl2 jest rozpoznane jako vm
<div ng-controller="Ctrl2 as ctrl2">
Ctrl2: {{ctrl2.test}}
function Ctrl2() {
var vm = this;
vm.test = 'test 2';
}
A jeśli przypiszemy vm do $scope?
(function () {
angular
.module('app', [])
.controller('Ctrl1', Ctrl1)
.controller('Ctrl2', Ctrl2)
.controller('Ctrl3', Ctrl3);
Ctrl1.$inject = ['$scope'];
function Ctrl1($scope) { $scope.vm = this; }
Ctrl2.$inject = ['$scope'];
function Ctrl2($scope) { $scope.vm = this; $scope.vm.test = 'test 2'; }
Ctrl3.$inject = ['$scope'];
function Ctrl3($scope) { $scope.vm = this; }
})();
Nie zalecane!
Oraz wrócimy do klasycznej składni
<div ng-controller="Ctrl1">
Ctrl1: {{vm.test}}
<div ng-controller="Ctrl2">
Ctrl2: {{vm.test}}
<div ng-controller="Ctrl3">
Ctrl3: {{vm.test}}
</div>
</div>
</div>
Otrzymamy
Ctrl1:
Ctrl2: test 2
Ctrl3:
Po co cała ta zabawa?
Jeśli używasz tylko bindowania
danych, nie musisz używać $scope!
Co jednak gdy $scope jest potrzebny?
Watro pomyśleć o przeniesieniu tej
funkcjonalności poza kontroler.
controllerAs - html
<div ng-controller="Ctrl1">
<div ng-controller="Ctrl1 as vm">
<div ng-controller="Ctrl1 as ctrl1">
controllerAs - routing
config: {
templateUrl: 'strona1.html',
controller: 'Ctrl1',
controllerAs: 'vm'
}
Dziękuję za uwagę
Dariusz Kalbarczyk
ngkalbarczyk@gmail.com
https://pl.linkedin.com/in/ngkalbarczyk
https://www.facebook.com/dkalbarczyk
https://twitter.com/ngKalbarczyk
http://ng-poland.pl
http://www.meetup.com/AngularJS-Warsaw

More Related Content

PPTX
Asynchroniczne testy JavaScript aplikacji webowych
PDF
AngularJS szkolenie wewnętrzne (into)
PDF
TypeScript as a runtime error terminator
PDF
Budowa elementów GUI za pomocą biblioteki React - szybki start
PPTX
Ulepszanie aplikacji webowej z AngularJS
PDF
Angular js warsztaty stopień 1
PPTX
AngülarJS – Czyli o czym warto pamiętać programując za Odrą
PPTX
ASP.NET MVC - najważniejsze założenia
Asynchroniczne testy JavaScript aplikacji webowych
AngularJS szkolenie wewnętrzne (into)
TypeScript as a runtime error terminator
Budowa elementów GUI za pomocą biblioteki React - szybki start
Ulepszanie aplikacji webowej z AngularJS
Angular js warsztaty stopień 1
AngülarJS – Czyli o czym warto pamiętać programując za Odrą
ASP.NET MVC - najważniejsze założenia

Similar to AngularJS Warsaw #4 - Dariusz Kalbarczyk "Controller as" (20)

PDF
Podstawy AngularJS
PDF
Architektura ngrx w angular 2+
PDF
Automatyzacja utrzymania jakości w środowisku PHP
PPTX
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
PDF
AngularJS - podstawy
PPTX
Bohater UI bez front end developera ?
PDF
Podstawy JavaScript | DreamLab Academy #7
PDF
Lexical scope, function vs. block scope, hoisting, scope closures
PPTX
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PDF
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
PPTX
Programowanie aplikacji dla Windows 8 (WinRT)
PDF
Kickoff to Node.js
PDF
Patronage 2016 Windows 10 Warsztaty
PDF
Michał Dec - Quality in Clouds
PDF
Angular 2.0 – Kochaj albo rzuć!
PDF
Laravelowe paczki do uwierzytelniania
PDF
Angular js warsztaty stopień 2
PDF
GraphQL w React z wykorzystaniem Apollo
PPTX
Reactive programming
PDF
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Podstawy AngularJS
Architektura ngrx w angular 2+
Automatyzacja utrzymania jakości w środowisku PHP
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
AngularJS - podstawy
Bohater UI bez front end developera ?
Podstawy JavaScript | DreamLab Academy #7
Lexical scope, function vs. block scope, hoisting, scope closures
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
Programowanie aplikacji dla Windows 8 (WinRT)
Kickoff to Node.js
Patronage 2016 Windows 10 Warsztaty
Michał Dec - Quality in Clouds
Angular 2.0 – Kochaj albo rzuć!
Laravelowe paczki do uwierzytelniania
Angular js warsztaty stopień 2
GraphQL w React z wykorzystaniem Apollo
Reactive programming
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Ad

AngularJS Warsaw #4 - Dariusz Kalbarczyk "Controller as"

  • 2. Czysty kod - "Controller as" w obronie kanciastego. Dariusz Kalbarczyk 2015-10-22
  • 3. Dziękuję za to że jesteście z nami dzisiaj.
  • 4. Co ja tutaj robię ;) http://goo.gl/ZFvbc8 http://goo.gl/9OUbV7
  • 5. Angular Module Angular Module Config Routs View Controllers Directives Factories $scope
  • 6. Kontroler – JavaScript’owy konstruktor // JavaScript Constructor function Car(){ this.model = 'RANGE ROVER'; this.price = 300000; this.engine = '3.0 V6' } // za każdym razem kiedy otwieramy kontroler, tworzymy nową instancję var sale = new Car();
  • 7. Klasyczne wywołanie kontrolera angular .module('app.cars') .controller('Car', Car); function Car($scope){ $scope.model = 'RANGE ROVER'; $scope.price = 300000; $scope.engine = '3.0 V6'; } $scope
  • 8. Składnia - Controller As angular .module('app.cars') .controller('Car', Car); function Car(){ var vm = this; vm.model = 'RANGE ROVER'; vm.price = 300000; vm.engine = '3.0 V6'; } vm = this
  • 9. $scope vs VM angular .module('app.cars') .controller('Car', Car); function Car($scope){ console.log('scope ',$scope); };
  • 10. $scope vs VM angular .module('app.cars') .controller('Car', Car); function Car(){ var vm = this; console.log('vm ', vm); };
  • 11. $scope • $id • $apply • $digest • $watch • $broadcast • $destroy • $emit • $eval
  • 12. $scope • $new • $on • $parnet • $root • $watchCollection • $evalAsync • …
  • 13. Zagnieżdżanie kontrolerów <div ng-controller="Ctrl1"> {{test}} <div ng-controller="Ctrl2"> {{test}} <div ng-controller="Ctrl3"> {{test}} </div> </div> </div> Która wartość zostanie wyświetlona?
  • 14. Bardziej czytelnie <div ng-controller="Ctrl1"> {{ctrl1.test}} <div ng-controller="Ctrl2"> {{ctrl2.test}} <div ng-controller="Ctrl3"> {{ctrl3.test}} </div> </div> </div>
  • 15. Co się stanie? <div ng-controller="Ctrl1"> Ctrl1: {{test}} <div ng-controller="Ctrl2"> Ctrl2: {{test}} <div ng-controller="Ctrl3"> Ctrl3: {{test}} </div> </div> </div>
  • 16. Co się stanie? (function () { angular .module('app', []).controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2).controller('Ctrl3', Ctrl3); Ctrl1.$inject = ['$scope']; function Ctrl1($scope) { $scope.test="test 1"} Ctrl2.$inject = ['$scope']; function Ctrl2($scope) {} Ctrl3.$inject = ['$scope']; function Ctrl3($scope) {} })();
  • 17. Otrzymamy Ctrl1: test 1 Ctrl2: test 1 Ctrl3: test 1
  • 18. Co się stanie? (function () { angular .module('app', []).controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2).controller('Ctrl3', Ctrl3); Ctrl1.$inject = ['$scope']; function Ctrl1($scope) {} Ctrl2.$inject = ['$scope']; function Ctrl2($scope) {} Ctrl3.$inject = ['$scope']; function Ctrl3($scope) {$scope.test="test 3"} })();
  • 19. Otrzymamy Ctrl1: Ctrl2: Ctrl3: test 3 Dzieci chętnie korzystają z zasobów rodziców, odwrotnie to nie działa, trochę tak jak w życiu ;)
  • 20. Controller As <div ng-controller="Ctrl1 as vm"> Ctrl1: {{vm.test}} <div ng-controller="Ctrl2 as vm"> Ctrl2: {{vm.test}} <div ng-controller="Ctrl3 as vm"> Ctrl3: {{vm.test}} </div> </div> </div>
  • 21. Co się stanie? (function () { angular .module('app', []) .controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2) .controller('Ctrl3', Ctrl3); Ctrl1.$inject = ['$scope']; function Ctrl1($scope) { $scope.vm={ test : 'test 1' } }; Ctrl2.$inject = ['$scope']; function Ctrl2($scope) {} Ctrl3.$inject = ['$scope']; function Ctrl3($scope) {} })();
  • 23. Controller As bez $scope <div ng-controller="Ctrl1 as vm"> Ctrl1: {{vm.test}} <div ng-controller="Ctrl2 as vm"> Ctrl2: {{vm.test}} <div ng-controller="Ctrl3 as vm"> Ctrl3: {{vm.test}} </div> </div> </div>
  • 24. Gdzie jest $scope? (function () { angular .module('app', []) .controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2) .controller('Ctrl3', Ctrl3); function Ctrl1() {} function Ctrl2() { var vm = this; vm.test = 'test 2';} function Ctrl3() {} })();
  • 25. Otrzymamy Ctrl1: Ctrl2: test 2 Ctrl3: Nie ma $scope a jednak działa i nie jest to Angular2
  • 26. Czy można bardziej czytelnie? <div ng-controller="Ctrl1 as ctrl1"> Ctrl1: {{ctrl1.test}} <div ng-controller="Ctrl2 as ctrl2"> Ctrl2: {{ctrl2.test}} <div ng-controller="Ctrl3 as ctrl3"> Ctrl3: {{ctrl3.test}} </div> </div> </div> Podmieniamy vm na nazwę kontrolera
  • 27. Ale nic nie zmieniamy w kodzie JavaScript! (function () { angular .module('app', []) .controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2) .controller('Ctrl3', Ctrl3); function Ctrl1() {} function Ctrl2() { var vm = this; vm.test = 'test 2';} function Ctrl3() {} })(); Tu nadal pozostaje vm
  • 28. ctrl2 jest rozpoznane jako vm <div ng-controller="Ctrl2 as ctrl2"> Ctrl2: {{ctrl2.test}} function Ctrl2() { var vm = this; vm.test = 'test 2'; }
  • 29. A jeśli przypiszemy vm do $scope? (function () { angular .module('app', []) .controller('Ctrl1', Ctrl1) .controller('Ctrl2', Ctrl2) .controller('Ctrl3', Ctrl3); Ctrl1.$inject = ['$scope']; function Ctrl1($scope) { $scope.vm = this; } Ctrl2.$inject = ['$scope']; function Ctrl2($scope) { $scope.vm = this; $scope.vm.test = 'test 2'; } Ctrl3.$inject = ['$scope']; function Ctrl3($scope) { $scope.vm = this; } })(); Nie zalecane!
  • 30. Oraz wrócimy do klasycznej składni <div ng-controller="Ctrl1"> Ctrl1: {{vm.test}} <div ng-controller="Ctrl2"> Ctrl2: {{vm.test}} <div ng-controller="Ctrl3"> Ctrl3: {{vm.test}} </div> </div> </div>
  • 32. Po co cała ta zabawa? Jeśli używasz tylko bindowania danych, nie musisz używać $scope!
  • 33. Co jednak gdy $scope jest potrzebny? Watro pomyśleć o przeniesieniu tej funkcjonalności poza kontroler.
  • 34. controllerAs - html <div ng-controller="Ctrl1"> <div ng-controller="Ctrl1 as vm"> <div ng-controller="Ctrl1 as ctrl1">
  • 35. controllerAs - routing config: { templateUrl: 'strona1.html', controller: 'Ctrl1', controllerAs: 'vm' }
  • 36. Dziękuję za uwagę Dariusz Kalbarczyk ngkalbarczyk@gmail.com https://pl.linkedin.com/in/ngkalbarczyk https://www.facebook.com/dkalbarczyk https://twitter.com/ngKalbarczyk http://ng-poland.pl http://www.meetup.com/AngularJS-Warsaw