2016-12-06 14 views
0

私はそれについて多くの記事を読んだが、私のコードで何が間違っているかは分かりません。私は2人のコントローラを持っています.1人は1人あたりの注文を収集し、もう1つは注文した製品でテーブルを表示します。明らかに、私は彼らに注文/製品に関するデータを共有してもらいたい。残念ながら、私は新しい製品を追加した後でordersテーブルを更新することはできません。コントローラ間でデータを共有し、コントローラ間でデータを共有する角度

export class OrderReviewController { 
    ... 
    getProducts =() => { 
     this.orderDataFactory.setOrders(this.orderService.getOrdersPerAppointment()); 
     return this.orderDataFactory.getProducts(); 
    } 
} 

export class ProductController { 
    ... 
    refreshOrdersTable =() => { 
     this.ordersData.setOrders(this.orderService.getOrdersPerAppointment()); 
     this.ordersData.setProducts(undefined); 
    } 
} 

export class OrdersData implements interfaces.IOrdersDataFactory { 
    orders: interfaces.IOrder[]; 
    products: interfaces.ISalesOrderDetail[]; 

    getOrders =() => { 
     return this.orders; 
     } 

    setOrders = (orders: interfaces.IOrder[]) => { 
     this.orders = orders; 
    } 

    getProducts =() => { 
     if (!this.products){ 
     this.products = []; 
     for (var i = 0; i < this.orders.length; i++) { 
      this.products = this.products.concat(this.orders[i].products); 
     } 
     } 
    return this.products; 
    } 

    setProducts = (products:any) => { 
     this.products = products; 
    } 
} 

`<tr ng-repeat="sample in oc.getProducts()"> 
    <td><a href="" ng-dblclick="oc.openOrderPopup(sample.SalesOrderId.Id)">{{product.salesordername}}</a></td> 
             <td><a href="" ng-dblclick="oc.openContactPopup(sample.cdss_contactid.Id)">{{product.customerName}}</a></td> 
             <td>{{product.title}}</td> 
             <td>{{product.subject}}</td> 
             <td>{{product.type}}</td> 
             <td>{{product.sent ? "yes" : "no"}}</td> 
            </tr>` 

残念ながら、私が手にonload:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

+0

angularjs typescriptですを使用していません。角2はする。しかし、あなたのテンプレートはangularjsのように見えます。あなたはどちらを使っていますか? –

+0

私は以前にAngular 1.xでtypescriptを使用していましたが、typescriptがそこで問題になっているとは思われません。私は角度1.5.8を使用 – cAMPy

答えて

0

問題はOrdersDataクラスのgetProducts()メソッドの中にあります。問題は、関数が実行されるたびに新しい配列を作成することです。新しいアレイを作成するタイミングを定義する代わりに、更新の基準をいくつか使用して、毎回製品アレイを再作成するべきではありません。

orders配列が前回と同じ場合は、同じオブジェクトを返します。

getProducts =() => { 

    if(!this.products || someUpdateCriteria) { 
     this.products = []; 
     for (var i = 0; i < this.orders.length; i++) { 
      this.products = this.products.concat(this.orders[i].products); 
     } 
    } 

    return this.products; 
} 

詳細については、こちらの記事を参照してください:https://docs.angularjs.org/error/ $ rootScope/infdig

+0

こんにちは、あなたの提案に従って私の更新されたコードを見てください。私はgetProductsが新しい製品を追加した後に呼び出されているのを見ることができますが(未定義のthis.productsを設定するのはちょっと醜いですが)、これは注文テーブルに反映されていません。私はまだ何が問題なのか分かりません... – cAMPy

+0

どのようにrefreshOrdersTable関数を呼び出していますか?リピータをリフレッシュするために製品情報を更新した後にscope.apply()を実行する必要があるかもしれません – hagner

+0

私はちょうど2回チェックして、getProductsが製品を追加した後に呼び出されないようです...私は混乱しています。前のコントローラ間のデータ。 – cAMPy

関連する問題