从 Backbone 习惯转换为 Meteor:触发事件
Converting from Backbone habits to Meteor: trigger events
在 Backbone 中,如果你想在模型之间交谈,你通常会通过事件进行。例如,如果 sayHi()
应该在 Friend
模型而不是 Stranger
模型中完成,您将执行以下操作。
陌生人内部
Friend.trigger("callSayHi");
朋友里面
this.listenTo("callSayHi", function() {
sayHi();
}
我想在 Meteor 中做同样的事情,我想使用 Session
var fitted。
陌生人内部
Session.set("callSayHi", true);
朋友里面
if (Session.get("callSayHi") {
sayHi();
}
// Session.set("callSayHi", false); <-- PROBLEM
让我们在这里忽略范围问题(使用 ReactiveVar
更好,等等)。问题是,为了更恰当地处理这种情况,我必须在末尾再次将会话变量设置为 false
,但这会无限地调用 sayHi()
事件。我觉得这种情况很常见。 Meteor 的处理方式是什么?
您可以在模板内部或外部使用 tracker。一旦其反应依赖项之一发生变化,它将重新运行。
模板外的示例:
Tracker.autorun(function() {
//will be run only once when Session.get('callSayHi') is true
if(Session.get('callSayHi') {//dependency on Session var
sayHi();
Session.set("callSayHi", false);
}
});
模板中的示例:
Template.yourTemplate.onCreated(function(){
this.autorun(function() {
//will be run only once when Session.get('callSayHi') is true
if(Session.get('callSayHi') {//dependency on Session var
sayHi();
Session.set("callSayHi", false);
}
});
});
在 Backbone 中,如果你想在模型之间交谈,你通常会通过事件进行。例如,如果 sayHi()
应该在 Friend
模型而不是 Stranger
模型中完成,您将执行以下操作。
陌生人内部
Friend.trigger("callSayHi");
朋友里面
this.listenTo("callSayHi", function() {
sayHi();
}
我想在 Meteor 中做同样的事情,我想使用 Session
var fitted。
陌生人内部
Session.set("callSayHi", true);
朋友里面
if (Session.get("callSayHi") {
sayHi();
}
// Session.set("callSayHi", false); <-- PROBLEM
让我们在这里忽略范围问题(使用 ReactiveVar
更好,等等)。问题是,为了更恰当地处理这种情况,我必须在末尾再次将会话变量设置为 false
,但这会无限地调用 sayHi()
事件。我觉得这种情况很常见。 Meteor 的处理方式是什么?
您可以在模板内部或外部使用 tracker。一旦其反应依赖项之一发生变化,它将重新运行。
模板外的示例:
Tracker.autorun(function() {
//will be run only once when Session.get('callSayHi') is true
if(Session.get('callSayHi') {//dependency on Session var
sayHi();
Session.set("callSayHi", false);
}
});
模板中的示例:
Template.yourTemplate.onCreated(function(){
this.autorun(function() {
//will be run only once when Session.get('callSayHi') is true
if(Session.get('callSayHi') {//dependency on Session var
sayHi();
Session.set("callSayHi", false);
}
});
});