我正在开发一个已经开发过的项目,我看到了这段代码
onBeforeAction: function() {
if(this.data()) {
this.subscribe('edition', this.params.editionId).wait();
}
},
data: function() {
var editionId=this.params.editionId;
var edition = Editions.findOne({"permalink":editionId})
if(!edition)
edition = Editions.findOne({_id: editionId})
return {
edition: edition
};
}
这里的this.data()
功能是什么?我从未在流星中听说过它。这是正确的方法吗?
我将其更改为以下内容并遇到一些问题并解决了问题:)
onBeforeAction: function() {
this.subscribe('edition', this.params.editionId).wait();
},
data: function() {
if(this.ready()){
var editionId=this.params.editionId;
var edition = Editions.findOne({"permalink":editionId})
if(!edition)
edition = Editions.findOne({_id: editionId})
return {
edition: edition
};
}
}
哪一个更好?为什么?什么是this.data()
所有关于
答案 0 :(得分:2)
两者都没有比另一个好 - 每个都有不同的功能,虽然看似相似。
this.data()
返回路由的数据上下文,这实际上是您从路由中的data
函数返回的内容。
另一方面,ready
返回一个布尔值,表示您正在等待的订阅已返回(或以其他方式调用this.ready()
)。 ready
的结果告诉我们何时返回数据,但却无法深入了解实际数据。
所以,即使两者都可以用来等待'对于订阅的结果,这里要注意的重要事项是订阅可以准备好'但由此产生的数据'可能是falsy / null(例如,使用假/posts/:_id
访问_id
路由的结果)。
两者之间差异的一个很好的例证是IR附带的dataNotFound
插件,您可能会在其中看到以下内容(为简化起见而简化):
Router.hooks.dataNotFound = function () {
if (!this.ready()) { // ready() call
this.next();
return;
}
var data = this.lookupOption('data'); // data() call
...
if (!data) {
this.render('notFoundTemplate');
return;
}
...
this.next();
};
使用ready
调用(每当状态发生变化时重新运行),我们等待整个订阅等待列表完成,然后我们检查数据是否有用。如果没有,我们会提供一个“不发现”的信息。模板,否则我们只需调用this.next()
移动到下一个钩子。
希望这有帮助。