如何在每次从服务器更新集合时调用函数?

时间:2016-01-13 16:50:03

标签: meteor angular-meteor

例如,在这个控制器方对象自动更新时,另一个用户更改Paries集合,但我们如何捕获此更新并运行一些控制器逻辑?

this.helpers({ parties: () => Parties.find({}) });

指明的问题: 收到的答案并不能解决我的问题,因为它不是服务器逻辑或我需要在更新时执行的任何数据库操作。实际上它是我需要运行的控制器逻辑。

在以下示例中,如果未更改表单,则禁用提交按钮。 isFormChange函数将party与originalParty进行比较。当聚会从服务器端更改时,我需要重新定义originalParty值。那我怎么能这样做呢?

<form ng-submit="vm.updateParty()">
  <input type="text" ng-model="vm.party.name">
  <input type="submit" ng-disabled="!vm.isFormChanged()" value="Submit">
</form>

指令控制器:

function Ctrl($scope, $reactive) {
  let vm = this;
  $reactive(vm).attach($scope);

  vm.helpers({ party: () => Parties.findOne({_id: vm.partyId}) });
  let originalParty = angular.copy(vm.party);
  vm.isFormChanged = isFormChanged;
  vm.updateParty = updateParty;

  function isFormChanged() {
    return !angular.equals(vm.party, originalParty);
  }

  function updateParty() {
    Meteor.call('updateParty', vm.party._id, vm.party.name);
  }
}

2 个答案:

答案 0 :(得分:1)

使用collection-hooks包在更新,升级,插入和删除之前或之后运行代码。

myCollection.after.update(userId, doc, fieldNames, modifier, options){
  ...your code
}

答案 1 :(得分:0)

如果您在Meteor methods中拥有数据库功能,则可以在服务器上运行逻辑。

示例:

Parties = new Mongo.Collection("parties");

if (Meteor.isClient) {
    // This code only runs on the client
    Meteor.subscribe("parties");
    /* a helper or event can run the Meteor.call() */
    var partyData = {}; // get partyData
    Meteor.call("insertParty", partyData,
        // callback function
        function (error, result) {
            if (error) { console.log(error); };
        });
}

if (Meteor.isServer) {
    // This code only runs on the server
    Meteor.publish("parties", function () {
        return Parties.find({});
    });
    Meteor.methods({
        insertParty: function (partyData) {
            // insert logic to run on partyData here
            Parties.insert(partyData);
        }
    })
}