【问题标题】:How can I be updated of an attribute change in Meteor?如何更新 Meteor 中的属性更改?
【发布时间】:2016-01-18 08:40:03
【问题描述】:

我有一个订阅文档的模板。只要模板助手中使用的属性发生更改,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,但跟踪器没有重新运行。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    使用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);
      });
    });
    

    【讨论】:

    • 是的 Template.currentData() 是我缺少的让数据反应的东西。感谢您使我免于创建从需要由隐藏元素调用的助手更新的反应变量..!
    【解决方案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 ..
      }
    }
    

    在meteor的官方todo app tutorial中也用到了这个概念。

    【讨论】:

    • 更改来自服务器。对不起,我一开始应该更清楚。我已经更新了问题。
    【解决方案3】:

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

    here's the docs link

    【讨论】:

    • 是的,我试过了(我用更多信息更新了问题)但没有奏效
    【解决方案4】:

    尝试将订阅移至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,所以你可以将它存储为会话变量

    【讨论】:

    • 好吧,如果你不是在路由方法中传递数据,而是将它传递给模板帮助器,这肯定是响应式的。
    • 是的,模板助手是完全反应式的,但在其中放置未专门附加到 DOM 渲染的代码感觉不对,而且我找不到如何从onCreated/onRendered to the helpers...我可以将我的变量写入 DOM 并使用正确更新的助手并定期检查 DOM 元素的值,但这感觉非常错误
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2016-05-23
    • 2014-07-27
    相关资源
    最近更新 更多