什么是流星或铁路由器中的this.data()

时间:2014-11-24 12:25:28

标签: meteor

我正在开发一个已经开发过的项目,我看到了这段代码

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()所有关于

1 个答案:

答案 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()移动到下一个钩子。

希望这有帮助。