流星のアプリケーションで角度を使用していますが、コントローラ変数のレコードがサーバー上のレコードに変更があったときにクライアント上で自動的に更新されるとき、それを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
のコレクションを介して公開されているデータを、Tables
とOrders
というクライアントに集めています。これは完璧です。私はデータを処理して、サブスクリプションの準備ができたら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からの最新の値でどのように更新されるのか分かりません。
私が何かを明らかに欠落している可能性がありますが、私はこの問題が発生した理由を知りたいとどのように私はそれ
すべてのヘルプから/被害に利益をもたらすことができますか?
Meteorがデザインしたものをそのまま使用しています。データベースへの更新はGUIに直ちに反映されます。これは中核のMeteorの設計にあります。 – mwarren
ことは、GUIを使用するモデルにバインドする前に私のデータを処理するカスタム関数を使用していることです。データベースが更新されたときに関数が呼び出されない限り、GUIがどのように新しいデータを取得するのでしょうか? – Vinay
メテオの資料をお読みください。 Collection.find()はカーソルを返します。カーソルは反応的なデータソースです。クライアント上で、fetch、map、またはforEachを使用してカーソルのドキュメントを最初にリアクティブ計算(テンプレートや自動実行など)内で取得すると、Meteorは基礎となるデータへの依存関係を登録します。カーソル内の文書を変更するコレクションを変更すると、再計算がトリガーされます。この動作を無効にするには、検索するオプションとして{react:false}を渡します。 – mwarren