2016-04-03 10 views
0

流星のアプリケーションで角度を使用していますが、コントローラ変数のレコードがサーバー上のレコードに変更があったときにクライアント上で自動的に更新されるとき、それをdb自体から変更した場合。以下は、上記のコードでは、私は2つのコレクションで構成されて混合物を公開しています私のコードコントローラのレコードを自動更新する角度流星

Client.js

(function() { 
    angular.module('testApp') 
     .controller('TestController', TestController); 

    //inject dependencies required  
    TestController.$inject = ['$state', '$mdDialog', '$reactive', '$scope']; 

    function TestController($state, $mdDialog, $reactive, $scope) { 
     var vm = this; 
     vm.dineInArray = []; 

     // to attach the scope to reactive var 
     $reactive(vm).attach($scope); 

     vm.helpers({ 
      tables: function() { 
       return Tables.find({}); 
      }    
     }); 

     var tableOrderCompSubscription = vm.subscribe('tableOrders'); 

     Tracker.autorun(function() { 
      if (tableOrderCompSubscription.ready()) { 
       createDineInArray(); 
      } 
     }); 

     function createDineInArray() { 
      var tempArray = []; 
      var order; 
      vm.tables.forEach(function(table) { 
       order = Orders.findOne({ tableId: table._id }); 
       if (order) { 
        table.orderId = order._id; 
        table.menuItems = order.menuItems; 
       } 
       tempArray.push(table); 
      });    
      vm.dineInArray = tempArray; 
     } 
    } 
})(); 

Server.js今

Meteor.publishComposite('tableOrders', { 
     find: function() { 
      // Find top ten highest scoring posts 
      return Tables.find({}); 
     }, 
     children: [{ 
      find: function(table) { 
       // Find post author. Even though we only want to return 
       // one record here, we use "find" instead of "findOne" 
       // since this function should return a cursor. 
       return Orders.find({ tableId: table._id }, { limit: 1 }); 
      } 
     }] 
    }); 

です流星パッケージthisの助けを借りて。私はtableOrdersのコレクションを介して公開されているデータを、TablesOrdersというクライアントに集めています。これは完璧です。私はデータを処理して、サブスクリプションの準備ができたらcreateDineInArray()関数内のコントローラのvm.dineInArray変数にすべてのデータを追加します。以下は、今私はTablesコレクション内の1つのレコードを持っているので、私は私のビューに描画されるdineInArrayに1つのアイテムを取得するとしvm.dineInArray

HTML

<div flex layout="row" ng-controller="TestLayoutController as vm"> 
    <!--Title bar end--> 
    <div layout="row" flex> 
     <md-content flex layout="row" layout-wrap> 
      <md-card class="table-card" md-ink-ripple ng-repeat="item in vm.dineInArray"> 
       <div flex layout="row" class="table-card-body" layout-align="center center"> 
        <p>{{item.pending}}/{{item.quantity}}</p> 
       </div> 
       <div layout="row" class="table-card-footer" layout-align="center center"> 
        <h4>{{ item.name }}</h4> 
       </div> 
      </md-card> 
     </md-content> 
    </div> 
</div> 

を使用して、私のhtmlがあります。何が起こるのは、私がRobongongoとしてGUIツールを介してmongo dbからそのレコードの値を直接変更し、dineInArray内の対応するレコードが何もしないで自動的に更新されるときです。

何かが変わるたびにヘルパー関数が呼び出されても、配列を生成する関数がヘルパーから呼び出されていないことは知っています。 Trackerがサブスクリプションが準備完了であることを示しているので、私の配列のレコードがServerからの最新の値でどのように更新されるのか分かりません。

私が何かを明らかに欠落している可能性がありますが、私はこの問題が発生した理由を知りたいとどのように私はそれ

すべてのヘルプから/被害に利益をもたらすことができますか?

+1

Meteorがデザインしたものをそのまま使用しています。データベースへの更新はGUIに直ちに反映されます。これは中核のMeteorの設計にあります。 – mwarren

+0

ことは、GUIを使用するモデルにバインドする前に私のデータを処理するカスタム関数を使用していることです。データベースが更新されたときに関数が呼び出されない限り、GUIがどのように新しいデータを取得するのでしょうか? – Vinay

+0

メテオの資料をお読みください。 Collection.find()はカーソルを返します。カーソルは反応的なデータソースです。クライアント上で、fetch、map、またはforEachを使用してカーソルのドキュメントを最初にリアクティブ計算(テンプレートや自動実行など)内で取得すると、Meteorは基礎となるデータへの依存関係を登録します。カーソル内の文書を変更するコレクションを変更すると、再計算がトリガーされます。この動作を無効にするには、検索するオプションとして{react:false}を渡します。 – mwarren

答えて

0

プロセスを詳細に説明したMeteorのドキュメントをご覧ください。

Collection.find()はカーソルを返します。

カーソルは反応的なデータソースです。クライアントで 反作用計算(テンプレートや自動実行など)の中でfetch、map、またはforEachを使用してカーソルのドキュメントを初めて取得すると、Meteorは を基になるデータに依存関係を登録します。 がカーソル内の文書を変更するコレクションを変更すると、再計算がトリガーされます。 にこの動作を無効にするには、検索するオプションとして{react:false}を渡します。

あなたの角度コントローラため

追加ヒント:それはどこでもあなたのコードの中で、あなたのデータを作成するか、別の関数でそれを行う場合には、限り、あなたは流星のコレクションから直接データを引き出してどのように重要ではありません、 dbで変更されたときに更新されます。

関連する問題