/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {Component, EventEmitter, Injectable, Input, NgModule, Output} from '@angular/core'; import {FormsModule} from '@angular/forms'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; /** * You can find the AngularJS implementation of this example here: * https://github.com/wardbell/ng1DataBinding */ // ---- model class OrderItem { constructor( public orderItemId: number, public orderId: number, public productName: string, public qty: number, public unitPrice: number) {} get total(): number { return this.qty * this.unitPrice; } } class Order { constructor( public orderId: number, public customerName: string, public limit: number, private _dataService: DataService) {} get items(): OrderItem[] { return this._dataService.itemsFor(this); } get total(): number { return this.items.map(i => i.total).reduce((a, b) => a + b, 0); } } // ---- services let _nextId = 1000; @Injectable() class DataService { orderItems: OrderItem[]; orders: Order[]; currentOrder: Order = null; constructor() { this.orders = [ new Order(_nextId++, 'J. Coltrane', 100, this), new Order(_nextId++, 'B. Evans', 200, this) ]; this.orderItems = [ new OrderItem(_nextId++, this.orders[0].orderId, 'Bread', 5, 1), new OrderItem(_nextId++, this.orders[0].orderId, 'Brie', 5, 2), new OrderItem(_nextId++, this.orders[0].orderId, 'IPA', 5, 3), new OrderItem(_nextId++, this.orders[1].orderId, 'Mozzarella', 5, 2), new OrderItem(_nextId++, this.orders[1].orderId, 'Wine', 5, 3) ]; } itemsFor(order: Order): OrderItem[] { return this.orderItems.filter(i => i.orderId === order.orderId); } addItemForOrder(order: Order): void { this.orderItems.push(new OrderItem(_nextId++, order.orderId, '', 0, 0)); } deleteItem(item: OrderItem): void { this.orderItems.splice(this.orderItems.indexOf(item), 1); } } // ---- components @Component({ selector: 'order-list-cmp', template: `