在Meteor中,如何在模板数据上下文的子部分上设置被动依赖关系?

在Meteor中,如何在模板数据上下文的子部分上设置被动依赖关系?,meteor,Meteor,考虑以下代码: Template.fullDoc.rendered = function() { // Get triggered whenever the selected document id changes this.autorun(function() { var docId = isolateValue(function() { return Template.currentData().selectedDoc._id;

考虑以下代码:

Template.fullDoc.rendered = function()  {

    // Get triggered whenever the selected document id changes
    this.autorun(function() {

        var docId = isolateValue(function() {
            return Template.currentData().selectedDoc._id; 
        });
        ...

    });

}
此代码不起作用。在
isolateValue()
内部,
Template.currentData()
有时会触发异常:
来自跟踪器的异常重新计算函数:错误:没有当前视图
(这对应于
Template.instance()
返回
null


那么,如何在模板数据上下文的子部分上设置被动依赖关系呢?

您可以以一种不会导致
template.instance()
有时设置为
null
的方式重新创建
isolateValue
行为

$ meteor add reactive-var
Template.fullDoc.rendered=函数(){
var docIdVar=new ReactiveVar();
这是一个自动运行(函数(){
docIdVar.set(Template.currentData().selectedDoc.\u id);
});
这是一个自动运行(函数(){
var docId=docIdVar.get();
// ...
});
}

这利用了一个事实,即将
ReactiveVar
设置为它已经具有的相同值不会触发无效。(默认情况下,这仅适用于基本体;对于对象,在构造
ReactiveVar
时,您需要传递一个自定义的
equalsFunc
。如果
\u id
是字符串,则可以。如果它是
ObjectID
则可能不是。)

什么是
IsolatValue
?IsolatValue()是来自此包的函数:该包是旧的。Meteor已进化,不再重新发布整个模板。为什么要使用IsolatValue函数?你用的是哪个版本的流星?我用的是最新的流星版本。我严重依赖isolateValue来优化反应性能。但它似乎不能正确处理Template.xxxx(),因此我将不得不使用下面的解决方案。不过,我更希望isolateValue是固定的,因为它允许更简洁和自我解释的代码。我将在他们的回购协议中发布一个问题。谢谢。它确实有效。您知道isolateValue()中的错误吗?我发现它明显不那么冗长…
isolateValue
在常规的
Tracker.autorun
中调用您的函数(当时它被称为
Deps.autorun
),而不是
templateInstance.autorun
。与所有异步回调一样,
Template.instance
的值通常在自动运行中丢失
templateInstance.autorun
不遗余力地保存它。谢谢你,伙计!你救了我很多研究!