I recently had a chance to try out the "controller as" alternative to storing model data and controller functions on the $scope of an Angular controller, and I was rather taken with the elegance of it.
An example of the familar method of attaching a controller to a view via the regular Angular router and exposing data and methods via the $scope:
Route:
...
when('/auth/sales/salesPage', {
templateUrl: 'views/sales.html',
controller: 'salesController'
})
...
Controller:
.controller( 'salesController', [ '$scope', 'demoService', function( $scope, demoService ) {
$scope.uiState = { pageLoaded: false };
$scope.performAction = function() {
console.log( "Action!" );
}
}]);
View:
<h1>Sales Prospects</h1>
<div ng-show="uiState.pageLoaded"></div>
...now the same code but using the "controller as" methodology:
Route:
...
when('/auth/sales/salesPage', {
templateUrl: 'views/sales.html',
controller: 'salesController as vm' //'vm' is now a reference to the controller object
})
...
Controller:
.controller( 'salesController', [ 'demoService', function( demoService ) {
var vm = this; //The controller object takes the place of the scope.
vm.uiState = { pageLoaded: false };
vm.performAction = function() {
console.log( "Action!" );
}
}]);
View:
<h1>Sales Prospects</h1>
<-- The route provides the controller object to the view as 'vm' -->
<div ng-show="vm.uiState.pageLoaded"></div>
Some of the benefits of this "controller as" methodology:
- You don't have to inject the $scope into the controller.
- If you have multiple views with multiple controllers on the same page, you can now have unique references/namespaces for each controller and not worry about name collisions between each controller's $scope.
- It looks cleaner.
- Less typing of "$scope" means you won't wear out the 4/$ key on your keyboard as quickly. :)
No comments:
Post a Comment