我们看到非常奇怪的流星行为。在执行简单事件挂钩(从表单收集信息,执行插入并更新Session变量)之后,客户端似乎再次启动,重新绘制整个页面。实际上,即使没有刷新浏览器窗口(或类似的东西),Meteor.startup也会被执行多次。更奇怪的是,我们制作了非常相似的应用程序,但它们根本不显示这种行为。我们无法发现不同项目之间存在任何显着差异。
我们正在使用Meteor版本0.6.4.1(在所有情况下),已删除autopublish和insecure。
Playlist.html:
<body>
{{> addSong}}
{{> playlist}}
</body>
<template name="addSong">
<form>
<fieldset>
<legend>Add a song to the playlist!</legend>
<div><input type="text" id="artist" /></div>
<div><input type="text" id="title" /></div>
<div><button type="submit" id="insertButton">Insert</button></div>
</fieldset>
</form>
</template>
<template name="playlist">
<div>Votes left: {{votes}}</div>
<ul>
{{#each songs}}
<li>
{{artist}} - {{title}} - {{score}}
<button class="voteUp" mongo_id="{{_id}}">Vote up!</button>
<button class="remove" mongo_id="{{_id}}">X</button>
</li>
{{/each}}
</ul>
</template>
LIB / common.coffee
@Songs = new Meteor.Collection "songs"
Songs.allow
insert: (userID) ->
true
update: (userID) ->
true
remove: (userID) ->
true
的客户机/ client.coffee
Meteor.subscribe "songs"
Template.playlist.songs = ->
Songs.find {},{sort:{"score":-1}}
Template.playlist.votes = -> Session.get("votes")
Template.addSong.events
'click #insertButton': (event,template) ->
artist = template.find("#artist").value
title = template.find("#title").value
Songs.insert({"artist":artist,"title":title,"score":1})
votes = Session.get("votes")
Session.set "votes", votes+3
return
Template.playlist.events
'click .voteUp': (event,template) ->
id = event.target.attributes.mongo_id.value
Songs.update({_id:id},{$inc:{"score":1}})
'click .remove': (event,template) ->
id = event.target.attributes.mongo_id.value
Songs.remove({_id:id})
Meteor.startup ->
alert "Starting"
Session.setDefault "votes", 0
服务器/ server.coffee
Meteor.publish "songs", -> Songs.find({})
要复制奇怪的行为,只需在表单上提交项目,每次都会触发启动(在Chrome和Safari中验证)。
答案 0 :(得分:0)
如果你在github上有代码,我可以帮忙看一下,但只有你的描述,很难说出问题是什么......
答案 1 :(得分:0)
行。我们发现了问题所在。 <form
&gt; tag,与提交按钮结合使客户端执行HTTP POST,从而导致整个页面重新呈现。
这是一个非常微妙的问题,很难被发现,但这里的教训是你不应该使用<form
&gt;标签,除非你绝对肯定。某种机制/警告/文档可能是防止这种情况发生在其他人身上的好主意。