我有一个订阅文档的模板。一旦模板助手中使用的属性发生变化,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,但是跟踪器并没有。重新运行。
答案 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,现在运行一个函数,并在其依赖项发生变化时重新运行它。
答案 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
,因此您可以将其存储为会话变量