gpt4 book ai didi

javascript - 调用方法时 meteor 进入路由

转载 作者:可可西里 更新时间:2023-11-01 09:43:22 25 4
gpt4 key购买 nike

有人可以向我解释为什么当我在路由器中有集合代码时会导致在调用方法时调用路由吗?

考虑以下 code :

主页.html

<template name="home">
{{ duplicate }}
<form>
<input type="text" name="test" value="somevalue">
<input type="submit" value="Submit">
</form>
</template>

脚本.js

Template.home.events({
'submit form': function (e) {
e.preventDefault();
console.log('Enter Meteor call');
Meteor.call('createDoc', { 'test': e.target.test.value });
}
});

路由.js

Router.onBeforeAction(function () {
console.log('Enter onBeforeAction');
$('#loading').show();
this.next();
});

Router.route('/', function () {
console.log('Enter action');
var foo = collection.findOne({ test: 'somevalue' }) ? 'true' : 'false';
this.render('home', {
data: {
'duplicate' : foo
}
});

Template.home.rendered = function () {
console.log('Enter rendered');
$('#loading').hide();
};
});

方法.js

collection = new Mongo.Collection('collection');

Meteor.methods({
createDoc: function (data) {
console.log('Enter createDoc');
collection.insert(data);
}
});

问题是,如果我在表单上按提交,在调用该方法后路由器将激活,即使 e.preventDefault() 出现。控制台日志清楚地显示了此行为:

"Enter Meteor call" script.js:4:3
"Enter createDoc" methods.js:5:3
"Enter onBeforeAction" routes.js:2:2
"Enter action" routes.js:8:2
"Enter onBeforeAction" routes.js:2:2
"Enter action" routes.js:8:2

此外,您可以看到路由器被调用了两次并且它从未进入 Template.home.rendered。这会导致加载 div 出现并且永远不会离开。我可以确认数据插入正确。

但是,如果我在 routes.js 中删除 collection.findOne(),此行为将消失并且一切都按预期工作。

问题

  • 为什么只有当我在路由中有 collection.findOne() 时才调用路由?

  • 为什么 collection.findOne({ test: 'somevalue' }) 从不返回路由内的任何内容? (我知道如何通过在 script.js 中使用 session 变量和助手来解决这个问题,但我想知道确切原因)

这会导致我的应用出现很多意外行为。非常感谢您。

最佳答案

正如其他人所回答的,您遇到的问题是由于 Meteor 将 react 性地重新运行在 react 性上下文中运行的代码,当且仅当该代码发出对 react 性数据源的调用时。

在您的情况下,对 findOne 的调用是对响应式数据源和 Router.route('/', function () {//context }) 中的上下文的调用; 是一个响应式(Reactive)上下文。

有两个重要的工具可以让您控制这种行为:一个是好的设计。注意 react 性并尝试围绕它设计代码。另一个正在检查 Tracker.active并使用 Tracker.nonreactive避免 react 性数据上下文中的 react 性。

这应该可以回答您的第一个问题。至于为什么您的 findOne 查询永远找不到任何东西:您是否已将数据从服务器发布到客户端?请查看Publish-Subscribe .你基本上需要:

// on the server
Meteor.publish('myPublication', function(author) {
return collection.find();
});
// on the client
Meteor.subscribe('myPublication');

关于javascript - 调用方法时 meteor 进入路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31358380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com