2016-08-27 7 views
0

私はかなり新しい角度(2週間)ですが、$scopeから派生したデータで構成された表の適切な実装の理解に問題があります。ng-repeatと条件付きの表を移入する

具体的には、私は$scope.reservationsと呼ばれるオブジェクトのアレイを有する別の$scope要素を有する

<table class="table table-hover"> 
    <thead> 
    <tr> 
     <th>Time</th> 
     <th>Status</th> 
     <th>Contact Person</th> 
    </tr> 
    </thead> 
    <tbody> 
     <tr ng-repeat="time in times" style="cursor:pointer"> 
     <td> {{time.time}} 
     </td> 
      <td> 

       <button type="button" class="btn btn-info btn-lg" ng-click="open(time.time)">Open</button> 

      </td> 
      <td>---</td> 
     </tr> 
    </tbody> 
    </table> 

:私は時間のハードコード配列(すなわち[{ "time": "8:00 - 8 - 30"},...)で移入いテーブルを有しています。モデル内のデータが次のようになります。私がしようとしています何

The Console output of $scope.reservations

$scope.reservations.timeSlot == {{time.time}}場合は、このケースでは、特定のdivを(表示する第二のカラム(状態)で、条件を入れています

$scope.reservations.timeSlot == {{time.time}}の場合、この条件は次の列(連絡先)でも使用されます。この場合、次のように表示されます。「$scope.reservations.timeSlot == {{time.time}}」と表示されます。 div$scope.reservations.NetIDとし、それ以外の場合は、 "---"を表示し続けます。

私は何とかng-repeatを別のng-repeat、おそらくはng-showにネストする必要があることを知っていますか?私はこれを達成するための正しい構文について私の頭を包み込むことに苦労しています。誰かがそのようなテーブルに値を設定するのに最適な方法を知っていますか?

UPDATE:ここで私は問題を再現するために作成さplunkerです:example Plunker

任意の助けいただければ幸いです、そしてあなたは私のために何か質問や懸念がある場合は、お気軽にお問い合わせください。私はこれを実装し、何が起こっているのかを実際に理解できるようにしたい。私はあなたが良い一日を持つことを願っています!あなたはそれを提示する前に、あなたの場合は、あなたのケースで

+0

クライアント側で情報が多すぎるように感じます。 confirmCodeは、提示する必要がある場合を除いて、クライアント側にはいけません。(あなたの説明では正しく発音されません) –

+0

plnkrは常に再現を助けてくれますし、問題をより簡潔に示しています。 – CozyAzure

+0

@ Yaronあなたは正しいのですが、現時点では$範囲にあまりにも多くの情報があります。私は情報がmongodbから来て、havntはまだdb.collection.find()フェッチの投影を追加しました。私はそれが適切に表示されると返されるデータの量を減らし、必要のないものは除外します。 –

答えて

3

ベストソリューション(サーバーまたはサーバー上でそれを得るとき、それはクライアントに送信されているいずれかの前に)、

をあなたが受け取ったデータを操作することになりますデータがこのように見えた:

$scope.times = [{ 
    "time": "8:00-8:30", 
    "reservation":null 
},{ 
    "time": "8:00-8:30", 
    "reservation": { 
     "_NetId": "1234567" 
    } 
}] 

次に、あなたがと$indexを使用することができます

... 
    <tr ng-repeat="time in times" style="cursor:pointer"> 
    <td> {{time.time}} 
    </td> 
     <td> 

      <button type="button" class="btn btn-info btn-lg" ng-click="open(time.time)">Open</button> 

     </td> 
     <td> 
     <span ng-if="!time.reservation">---</span> 
     <span ng-if="!!time.reservation">{{time.reservation.NetId}}</span> 
     </td> 
    </tr> 
... 
+0

Timesテーブルのデータと実際の予約データを結合する方が簡単だと私は同意します。 このアプリケーションは最終的にsocket.ioを組み込みます。その知識を考えれば、あなたのソリューションでは、そのタイプのデータを、おそらくanglejsサービスで作成し、次にクライアントにプッシュするのが最善だろうと思いますか?私は頻繁な更新が行われることを知っているところで、これを可能な限り最良の方法で実行していることを確認したいだけです。 –

+0

a)あなたは '$ scope 'を保持しているコントローラを持っています。これを使ってデータをフォーマットすることができます。 b)socket.ioは何も変更しません。 c)私がそれを行うと、クライアントに送信される前にデータをサーバに戻してしまう可能性があります。 –

+0

UIがあなたのアドバイスを試しましたが、 'times'をデカップリングに戻す必要がありました。実際の予約。上記の通りではありませんでしたが、予約のための複数の部屋があります。部屋Aが部屋Bに切り替えられた場合、部屋Bは部屋Aのすべての「予約済み」スポットも表示します。これは、$ scope.timesがすべての部屋で共有されているためです。回避策は部屋を変更するたびに$ scope.timesのデータをリセットすることですが、この条件付き書式をディレクティブで処理することができるように思えます。 –

0

ような何かを行うことができますreservationアレイからそれぞれのオブジェクトを使用するには、を使用します。

また、$scope.reservations.timeSlot == {{time.time}}かどうかを表示/非表示にすると、ng-show/ng-hideと同様の結果が表示されます。

<table class="table table-hover"> 
    <thead> 
    <tr> 
     <th>Time</th> 
     <th>Status</th> 
     <th>Contact Person</th> 
    </tr> 
    </thead> 
    <tbody> 
     <tr ng-repeat="time in times" style="cursor:pointer"> 
     <td> {{time.time}} 
     </td> 
      <td> 
       <div ng-show="reservations[$index].timeSlot == time.time">Already Taken</div> 
       <button type="button" class="btn btn-info btn-lg" ng-click="open(time.time)" ng-hide="reservations[$index].timeSlot == time.time">Open</button> 

      </td> 
      <td> 
       <div ng-show="reservations[$index].timeSlot == time.time">{{reservation[$index].netID}}</div> 
       <div ng-hide="reservations[$index].timeSlot == time.time">---</div> 
      </td> 
     </tr> 
    </tbody> 
    </table> 
+0

私はこのソリューションが気に入っていますが、オブジェクトの$ scope.reservations配列を完全に横断するようには見えません。最初のタイムスロットでは機能しますが、別の時間に行われた他の予約は更新されます。 $ scope.reservationsオブジェクトをすべて見て、.timeSlotをチェックするためにそれぞれの "時間"を取得するためにng-repeatをどこにでも置く必要がありますか? –

+0

'予約[$インデックス]'が予約配列を通過しています。だからトリックをする必要があります。 –

+0

これは 'reservations'配列の各' reservation'オブジェクトをループしていないようです。各行でループするどのようなメカニズムであれ、 'angular.forEach(reservations)'と同様にする必要があり、 'reservations'配列の' reservation.timeSlot'の全てと 'time'を比較してください。それが実証するのに役立つなら、私はPlunkerを作った。 [Plunkerへのリンク](http://plnkr.co/edit/nIJzgJ7JgyAvIeLYiX8i?p=preview) –