Showing posts with label Angular JS. Show all posts
Showing posts with label Angular JS. Show all posts

Wednesday, April 27, 2016

Difference between Angular 1.x and Angular 2

Angular 2 is still in beta (at the time of writing this post), but it has already created a buzz in community. Angular 2 will be a huge learning curve for developers. It is written entirely in Typescript and meets the ES6 specification. And it’s not an update for Angular 1.x. As it’s rewritten and includes breaking changes. So the best way to learn is to compare with Angular 1.x and find out what’s new in Angular 2. In this post, find out difference between Angular 1.x and Angular 2.

Difference between Angular 1.x and Angular 2

  • Angular 1.x was not built with mobile support in mind, where Angular 2 is mobile oriented.
  • Angular 2 provides more choice for languages. You can use any of the language from ES5, ES6, TypeScript or Dart to write Angular 2 code. Where, Angular 1.x has ES5, ES6 and Dart. Addition of TypeScript is a great step as TypeScript is awesome way to write JavaScript. 
  • Angular 1.x controllers and $scope are gone. We can say that controllers are replaced with “Components” in Angular 2. Angular 2 is component based.
    Angular 1.x Controller
    var myApp = angular
       .module("myModule", [])
       .controller("productController", function($scope) {
         var prods = { name: "Prod1", quantity: 1 };
         $scope.products = prods;
    }); 
    
    Angular 2 Components using TypeScript
    import { Component } from 'angular2/core';
    
    @Component({
      selector: 'prodsdata',
      template: `
        <h3>{{prods.name}}</h3> `
    })
    
    export class ProductComponent {
      prods = {  name: 'Prod1', quantity: 1 };
    }
    
    Notice, there is a class with export keyword, @Component annotation (that’s also new in Angular 2). The @Component annotation adds the metadata to the class.
  • Angular 1.x has 2 ways to bootstrap angular. One using ng-app attribute and other via code.
    <script>
       angular.element(document).ready(function() {
          angular.bootstrap(document, ['myApp']);
       });
    </script>
    
    In Angular 2, say goodbye to ng-app. The only way to bootstrap angular is via code.
      import { bootstrap } from 'angular2/platform/browser';
      import { ProductComponent } from './product.component';
    
      bootstrap(ProductComponent);
    
    The bootstrap function is used and it takes starting component which is also parent component of your angular application.
  • Structural directives syntax is changed. ng-repeat is replaced with *ngFor.
    Angular 1.x structural directives
    <ul>
       <li ng-repeat="technology in technologies">
         {{technology.name}}
       </li>
    </ul>
    <div ng-if="technologies.length">
       <h3>You have {{technologies.length}} technologies.</h3>
    </div>
    
    Angular 2 structural directives
    <ul>
      <li *ngFor="#technology of technologies">
        {{technology.name}}
      </li>
    </ul>
    <div *ngIf="technologies.length">
      <h3>You have {{technologies.length}} technologies.</h3>
    </div>
    
    Notice that Asterisk(*) sign is used as prefix for structural directives, in is replaced with of and camelCase syntax is used.
  • In Angular 2, local variables are defined using hash(#) prefix (see above code for *ngFor).
  • To filter output in our templates in Angular 1.x, we use the pipe character (|) and one or more filters. Where in Angular 2 they are called pipes. The syntax remains same.
  • Angular 2 uses camelCase syntax for built-in directives. For example, ng-class is now ngClass and ng-model is now ngModel.
  • One of the major change in Angular 2 is, that it directly uses the valid HTML DOM element properties and events. Due to this, many of the available built-in directives in Angular 1.x are now no longer required. Like, ng-hrefng-srcng-show and ng-hide. Angular 2 uses hrefsrc and hiddenproperties to get the same output. And same goes with event based directives like ng-click and ng-blur.
    <button ng-click="doSomething()">
    
    And in Angular 2, take the HTML event and wrap it with parentheses.
    <button (click)="doSomething()">
    
  • In Angular 1.x, ng-bind is used for one way data binding, but with Angular 2 it is replaced with [property], where property is valid HTML DOM element property.
    Angular 1.x, one way data binding
    <input ng-bind="technology.name"></input>
    
    Angular 2, one way data binding is achieved via wrapping the properties with square brackets.
    <input [value]="technology.name"></input>
    <div [style.color]="color">Some text...</div>
    
    Remember for events, parentheses is used and for properties, square brackets are used.
  • In Angular 1.x, ng-model is used for two way data binding, but with Angular 2 it is replaced with [(ngModel)].
    Angular 1.x, two way data binding
    <input ng-model="technology.name"></input>
    
    In Angular 2,
    <input [(ngModel)]="technology.name"></input>
    
  • In Angular 1.x, we can define a service via 5 different ways.
    • Factory
    • Service
    • Provider
    • Constant
    • Values
    And in Angular 2, class is the only way to define a service.
    import { Injectable } from 'angular2/core';
    
    @Injectable()
    export class TechnologyService {
      getTechnologies() {
        return [
          new technology(1, 'Angular'),
          new technology(2, 'jQuery',
          new technology(3, 'Node'),
          new technology(4, 'Knockout')
        ];
      }
    }
    
    And once defined, you need to register it with your main component usingprovider.
    import { Component } from 'angular2/core';
    import { TechnologyService } from './character.service';
    
    @Component({
      selector: 'my-app',
      template: '<technology-list></technology-list>',
      providers: [TechnologyService]
    })
    export class AppComponent {}
    
  • One of the advantage of Angular is Dependency Injection. With Angular 2 DI is there but now there is a different way to inject dependencies. As everything is class in Angular, so DI is achieve via constructor.
    var myApp = angular
       .module("myModule", [])
       .controller("productController", function($scope, $http) {
         var prods = { name: "Prod1", quantity: 1 };
         $scope.products = prods;
    }); 
    
    In Angular 2,
    import { Injectable } from 'angular2/core';
    
    @Injectable()
    export class TechnologyService {
      constructor(private _http: Http) { }
    
      getTechnologies() {
        return [
          new technology(1, 'Angular'),
          new technology(2, 'jQuery',
          new technology(3, 'Node'),
          new technology(4, 'Knockout')
        ];
      }
    }
    
    Notice, @Injectable() is added to service class. It is similar to Angluar 1.x$inject used for DI.
  • In Angular 1.x, we use $routeProvider.when() to configuring routing. Where in Angular 2, @RouteConfig{(...}) is used. ng-view present in Angular 1.x is replaced with <router-outlet>
    In Angular 1.x,
    var app = angular
            .module("MyModule", ["ngRoute"])
            .config(function ($routeProvider) { 
                $routeProvider 
                  .when("/home", { templateUrl: "home.html", controller: "homeController" })
                  .when("/technology", { templateUrl: "technology.html", controller: "technologyController" }) 
            })
           .controller("homeController", function ($scope) {
                $scope.message = "Home Page"; 
            })    
           .controller("technologyController", function ($scope) {
                 $scope.technologies = ["ASP.NET", "jQuery", "AngularJS", "JavaScript"]; 
           }) 
    
    In Angular 2,
    import { Component } from 'angular2/core';
    import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from 'angular2/router';
    import { TechnologyComponent } from './technology/technology.component';
    import { TechnologyService } from './Technology/Technology.service';
    
    @Component({
      selector: 'my-app',
      templateUrl: 'app/app.component.html',
      directives: [ROUTER_DIRECTIVES],
      providers: [
        ROUTER_PROVIDERS,
        TechnologyService
      ]
    })
    @RouteConfig([
      { path: '/home', name: 'Home', component: HomeComponent, useAsDefault: true },
      { path: '/technology', name: 'Technology', component: TechnologyComponent },
    ])
    export class AppComponent { }
    
    Routing is a separate module that’s why need to import it. And 2 more configurations needs to be to make routing work, one is adding[ROUTER_DIRECTIVES] as directive and other is to add ROUTER_DIRECTIVES in providers list. And in HTML page,
    <ul>
      <li><a [routerLink]="['Home']" href="">Home</a></li>
      <li><a [routerLink]="['Technology']" href="">Technology</a></li>
    </ul>
    
    ng-href is also replaced by [routerLink]
  • Angular 2 implements webstandards like components and it’s provide better performance than Angular 1.
Summary
Angular 2 is a really big step forward. And it certainly requires some efforts to migrate from Angular 1 to Angular 2. But it is in the right direction. Things are looking better and more inline with HTML. It is still in beta but eagerly waiting for the final release.

Wednesday, October 7, 2015

A Few Angular Kendo UI Best Practices

We've been hard at work getting ready for the official Angular Kendo UI v1 release. Stay tuned for more information on that very soon.
In the meantime, I thought I would address several issues that I see quite frequently as issues on the GitHub repo. A lot of these issues stem from a misunderstanding of how Kendo UI works when used alongside of Angular. Most of them are minor, and just require you to use the correct constructs and objects when dealing with Kendo UI widgets.  I know that these are common mistakes, because I make them myself all the time!

Handling Routes Between An AngularJS Application and ASP.NET MVC Application

In this article I will discuss how to handle routing between an AngularJS application that is created within an ASP.NET MVC application. You might have an existing ASP.NET MVC web application that is working all fine but would like to add a Single Page Application using AngularJS to the ASP.NET MVC web application and still allow you to access pages from your angular application and MVC application and vice versa from the same website. While this can be easily achieved with the hash sign (#) that angular routes provide support for by default, the urls generated are not SEO friendly. So you might want to set html5mode to true in angular to allow HTML5 browsers to serve angular pages without adding the hash sign to the urls in the address bar. Since you have an existing ASP.NET MVC application that uses its own routes, adding angular routes that no longer use the hash sign and making it all work can be tricky. Now you have to consider routing back and forth between angular routes and non-angular routes (ASP.NET MVC routes) on the same site.

I will use the default ASP.NET MVC application created in Visual Studio 2013 as an example.

In Visual Studio 2013, create an ASP.NET MVC application project and name it AngularRoutingDemo. I assume you are using IIS to host the website and not the Visual Studio internal IIS server that allocates a port number for your site. So, the address of the site I have configured on IIS is http://localhost/AngularRoutingDemo.

Read More here.

Example of an SPA with a login screen that uses AngularJS and connects to ASP.NET Web API 2

Question:

I would like to create a new AngularJS, Web API Single page application. Does anyone have any examples that show how I can set up a user login screen that connects to a WEB API controller for a simple login (no need for google/facebook login etc) that uses ASP.NET Identity and without the need for user registration.


Answer:
There are many answers are available on stack-overflow. But after a bunch of googling within 2 weeks of mine, I have found below mentioned two articles very useful for me. So I though to share the same with you.

  1. http://stackoverflow.com/a/21842533
  2. https://bitbucket.org/david.antaramian/so-21662778-spa-authentication-example/overview

Hope this can save someone's 2 weeks.

Enjoy.

Find a cool free stuff everyday

Giveaway of the Day

Hiren Bharadwa's Posts

DotNetJalps