/** Add Transpiler for Typescript */
System.config({
  transpiler: 'typescript',
  typescriptOptions: {
    emitDecoratorMetadata: true
  },
  packages: {
    '.': {
      defaultExtension: 'ts'
    },
    'vendor': {
      defaultExtension: 'js'
    }
  }
});

System.config({
  map: {
    'main': 'main.js',

    // Angular specific mappings.
    '@angular/core': 'https://unpkg.com/@angular/core/bundles/core.umd.js',
    '@angular/common': 'https://unpkg.com/@angular/common/bundles/common.umd.js',
    '@angular/compiler': 'https://unpkg.com/@angular/compiler/bundles/compiler.umd.js',
    '@angular/http': 'https://unpkg.com/@angular/http/bundles/http.umd.js',
    '@angular/forms': 'https://unpkg.com/@angular/forms/bundles/forms.umd.js',
    '@angular/router': 'https://unpkg.com/@angular/router/bundles/router.umd.js',
    '@angular/platform-browser': 'https://unpkg.com/@angular/platform-browser/bundles/platform-browser.umd.js',
    '@angular/platform-browser-dynamic': 'https://unpkg.com/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
    '@angular/material': 'https://unpkg.com/@angular/material/bundles/material.umd.js',

    // Rxjs mapping
    'rxjs': 'https://unpkg.com/rxjs',
  },
  packages: {
    // Thirdparty barrels.
    'rxjs': { main: 'index' },
  }
});
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {BrowserModule} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {MaterialModule} from '@angular/material';
import {AutocompleteExample} from './autocomplete';
import {DataService} from './http-mock-service.ts';

@NgModule({

  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    MaterialModule,
  ],

  declarations: [AutocompleteExample],
  bootstrap: [AutocompleteExample],
  providers: [DataService]
})
export class AppModule {}

platformBrowserDynamic().bootstrapModule(AppModule);
import {Component} from '@angular/core';
import {FormControl} from '@angular/forms';
import 'rxjs/add/operator/startWith';
import {DataService, ExampleDataMode} from './http-mock-service';

@Component({
    selector: 'autocomplete-example',
    template: `
    <!-- SEARCH BOX -->
    <md-input-container>
      <input mdInput placeholder="State" [mdAutocomplete]="auto" [formControl]="stateCtrl">
    </md-input-container>

    <!-- Aoutocomplete options list -->
    <md-autocomplete #auto="mdAutocomplete" [displayWith]="displayFn">
      <md-option *ngFor="let state of filteredStates | async" [value]="state">
      {{ state.name }}
      </md-option>
    </md-autocomplete>
    
    {{ selectedOption | json  }}
    
    <div style="background: grey" *ngIf="selectedOption">
      <label>Selected option Obj: </label>
      <p>id: {{ selectedOption.id }} Name: {{ selectedOption.name }}</p>
    </div>

    <!-- Available option list -->
    <div>
      <h3>List of available options</h3>
      <md-chip-list>
        <md-chip *ngFor="let state of _availableOptions" color="accent">
          {{ state.name }}
        </md-chip>
      </md-chip-list>
    </div>

    `,
})
export class AutocompleteExample {
    stateCtrl: FormControl;
    filteredStates: any;
    selectedOption: ExampleDataMode;
    _availableOptions: ExampleDataMode[];

    constructor(private dataService: DataService) {
        this.stateCtrl = new FormControl();
        this.filteredStates = this.stateCtrl.valueChanges
        .startWith(null)
        .map(obj => obj && typeof obj === 'object' ? obj.name : obj)
        .map(name => name ? this._filterStates(name) : []);
    }

    _filterStates(val: string) {
        return val ? this._availableOptions.filter((s) => {
            return new RegExp(val, 'gi').test(s.name);
        }) : this.states;
    }

    // Set single value for search box
    displayFn(state: ExampleDataMode): string {
        this.selectedOption = state;
        console.debug('Selected: ', this.selectedOption);
        return state ? state.name : '';
    }

    // Get data from MOCK service
    _getDataFromService(value: string) {
        this.dataService.getData()
        .then(data => {
            this._availableOptions = data
        });
    }

    ngOnInit() {
        // Get all option
        this._getDataFromService('');
        console.debug('Selected: ', this.selectedOption);
    }

}
<!DOCTYPE html>
<html>
<head>
  <title>Angular2 Material - Autocomplete with service data</title>

  <!-- Load common libraries -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/typescript/2.0.3/typescript.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/core-js/2.4.1/core.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/zone.js/0.6.25/zone.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js"></script>

  <!-- Configure SystemJS -->
  <script src="systemjs.config.js"></script>

  <script>
    System
      .import('main.ts')
      .catch(console.error.bind(console));
  </script>

  <!-- Load the Angular Material stylesheet -->
  <link href="https://unpkg.com/@angular/material/core/theming/prebuilt/indigo-pink.css" rel="stylesheet">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <style>body { font-family: Roboto, Arial, sans-serif; }</style>
</head>

<body>
<autocomplete-example>Loading Material - Autocomplete example...</autocomplete-example>
</body>

</html>
import { Injectable } from '@angular/core';

@Injectable()
export class DataService {
  getData(): Promise<ExampleDataMode[]> {
    return Promise.resolve(EXAMPLEDATA);
  }
}

export const EXAMPLEDATA: ExampleDataMode[] = [
  {id: 11, name: 'Mr. Nice'},
  {id: 12, name: 'Narco'},
  {id: 13, name: 'Bombasto'},
  {id: 14, name: 'Celeritas'},
  {id: 15, name: 'Magneta'},
  {id: 16, name: 'RubberMan'},
  {id: 17, name: 'Dynama'},
  {id: 18, name: 'Dr IQ'},
  {id: 19, name: 'Magma'},
  {id: 20, name: 'Tornado'}
];

export class ExampleDataMode {
  id: number;
  name: string;
}