如何更新Meteor中的属性更改?

时间:2016-01-17 07:04:21

标签: meteor

我有一个订阅文档的模板。一旦模板助手中使用的属性发生变化,DOM和Blaze更新中的所有内容都可以正常工作。

我还有一些自定义逻辑,它不会出现在DOM中,并且取决于文档属性。如何更新属性时如何调用函数来更改逻辑?

我正在寻找类似this.data.attr.onChanged的内容,其中this将引用模板,this.data是发送到模板的数据,如常;或者在我可以将回调放入的地方重新运行的Meteor功能。

我希望将召回​​template.onRendered,但事实并非如此。

我已经阅读了很多关于反应变量的内容,但却找不到它们在这里有用的方法。

[edit]更改来自与其他服务通信的服务器

我已经尝试Tracker.autorun这样:

Template.editItem.onRendered(function() {
  var self = this;
  Tracker.autorun(function () {
    console.log("tracker", self.data.item.socketId);
  });
});

相应的路线是:

Router.route('editItem', {
  path: '/edit/:_id',
  waitOn: function () {
    var sub = Meteor.subscribe('item', this.params._id);
    return [sub]; 
  },
  data: function () {
    return {item: Items.findOne(this.params._id)};
  },
  action: function () {
    if (this.ready())
      this.render();
  }
});

在某些时候,服务器会从相应的文档中删除属性socketId,我确信这是因为我已经检查了shell,但是跟踪器并没有。重新运行。

4 个答案:

答案 0 :(得分:2)

我不确定自己是否做对了,你只是想观察你的html输入并将新值应用于你的帮助方法??

如果是这样,您可以使用会话变量来存储临时UI状态:

// observe your input
Template.yourTemplate.events({
  "change #inputA": function (event) {
    if(event.target.value != "") {
      Session.set("valueA", event.target.value);
    }
  }
}

// apply the changed value on your helper function
Template.yourTemplate.helpers({

  getSomeData: function() {
    var a = Session.get("valueA");
    // do something with a ..
  }
}

在流星的官方todo app tutorial中也使用了这个概念。

答案 1 :(得分:2)

如果您需要重新运行不属于DOM / helper的内容,可以使用Tracker.autorun。根据meteor docs,现在运行一个函数,并在其依赖项发生变化时重新运行它。

here's the docs link

答案 2 :(得分:2)

使用Template.currentData().item.socketId代替self.data.item.socketId,这将为您提供反应性。

在模板中,通常使用self.autorun代替Tracker.autorun(与Tracker.autorun不同,这将确保在销毁模板时停止自动运行)。同样,如果您要订阅模板,请使用self.subscribe代替Meteor.subscribe

查看Template.currentData()是否适合您的代码:

Template.editItem.onRendered(function() {
  var self = this;
  self.autorun(function () {
    console.log("tracker", Template.currentData().item.socketId);
  });
});

答案 3 :(得分:0)

尝试将订阅移至Tracker.autorun

Template.editItem.onRendered(function() {
    var self = this;
    Tracker.autorun(function () {
        Meteor.subscribe('item', this.params._id);
        console.log("tracker", self.data.item.socketId);
    });
});

当然,您无法使用this.params,因此您可以将其存储为会话变量