我试图了解Meteor Deps跟踪系统的基本概念。
var favoriteFood = "apples";
var favoriteFoodDep = new Deps.Dependency;
var getFavoriteFood = function () {
favoriteFoodDep.depend();
console.log(favoriteFood)
};
var setFavoriteFood = function (newValue) {
favoriteFood = newValue;
favoriteFoodDep.changed();
};
Template.jow.events({
"click .showFavoriteFood":function(){
setFavoriteFood("cloudy")
}
})
所以在这段代码中我创建了一个新的Deps.Dependancy,我在getFavoriteFood中使用favoriteFoodDep.depend()离开了一个轨道。
然后在setFavoriteFood中,我调用favoriteFoodDep.changed()来触发依赖它的函数。
所以,我期待的是在设置setFavoriteFood(在click事件中)并因此触发.changed()后,所有具有.depend()的函数将再次触发并执行。在这种情况下,它会显示"阴天"在控制台中。
然而,什么都没发生,为什么会这样?
答案 0 :(得分:3)
只有某些类的函数会根据失效的依赖项重新运行。来自the docs:
这些Meteor函数将您的代码作为反应计算运行:
模板,Deps.autorun,UI.render和UI.renderWithData
您几乎是在正确的界限上,您只需要将setFavoriteFood
定义更改为以下内容:
var getFavoriteFood = function(newValue) {
console.log(favoriteFood);
}
Deps.autorun(function(c) {
favoriteFoodDep.depend();
getFavoriteFood();
}
显然,在这个简单的情况下,在autorun
块中进行日志记录实际上更简洁,但是作为一般实践,我将需要被动地运行的逻辑分离成一个单独的函数, 如上。但是,基本摘要是:如果它不在Deps.autorun
中,则depend
方法将无效。
<强>更新强>
最后要注意的是,您引用的示例会将depend()
方法保留在getFavoriteFood
函数中,这也可以正常工作(即您可以嵌套您的&#39;在函数内部依赖&#39;方法,然后由Deps.autorun
调用。我说根据用例的不同,有任何一种方法可以使用,并且可以接受:
get
,可能最好将depend
保留在其中,因为您可以从任何地方拨打depend
上面的函数类,它将自动被动。Deps.autorun
保留在{{1}}块中实际上会更有帮助,这样它就会立即显现出来正在被无效以使其重新运行而不必通过嵌套函数调用工作(根据经验,这可能是相当辛苦的工作)。