客户端上有多个初创公司

时间:2013-08-13 16:27:18

标签: meteor

我们看到非常奇怪的流星行为。在执行简单事件挂钩(从表单收集信息,执行插入并更新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中验证)。

2 个答案:

答案 0 :(得分:0)

如果你在github上有代码,我可以帮忙看一下,但只有你的描述,很难说出问题是什么......

答案 1 :(得分:0)

行。我们发现了问题所在。 <form&gt; tag,与提交按钮结合使客户端执行HTTP POST,从而导致整个页面重新呈现。 这是一个非常微妙的问题,很难被发现,但这里的教训是你不应该使用<form&gt;标签,除非你绝对肯定。某种机制/警告/文档可能是防止这种情况发生在其他人身上的好主意。