【问题标题】:Rails Backbone adding attributes work slow and buggyRails Backbone 添加属性工作缓慢且有问题
【发布时间】:2014-07-18 16:01:09
【问题描述】:

我正在制作一款有骨气的游戏。我制作了简单的统计页面并添加了统计信息。我怎样才能改进它以使其顺利工作?因为现在当我按“添加 5 个统计数据”时,然后我按“添加生命值”5 次,有时我会留下 1-2 个统计数据,有时我可以添加更多生命值,因为统计数据下降速度较慢,我正在尝试添加统计数据快速地。这是我的查看活动页面。

Sprint.Views.Stats ||= {}

class Sprint.Views.Stats.StatView extends Backbone.View
  template: JST["backbone/templates/stats/stat"]

  events:
    "click .add_health" : "add_health"
    "click .add_strength" : "add_strength"
    "click .add_stat" : "add_stat"

  tagName: "td"

  add_health: (e) ->
    e.preventDefault()
    e.stopPropagation()
    if @model.attributes.stat > 0
      @model.save(health: @model.attributes.health+1)
      @model.save(stat: @model.attributes.stat-1)
      @model.on("change", () => this.render() )

  add_strength: (e) ->
    e.preventDefault()
    e.stopPropagation()
    if @model.attributes.stat > 0
      @model.save(strength: @model.attributes.strength+1)
      @model.save(stat: @model.attributes.stat-1)
      @model.on("change", () => this.render() )

  add_stat: (e) ->
    e.preventDefault()
    e.stopPropagation()
    @model.save(stat: @model.attributes.stat+5)
    @model.on("change", () => this.render() )

  render: ->
    @$el.html(@template(@model.toJSON() ))
    return this

这是我的模板

Stats: <%= stat %><br>
Health: <%= health %><a href="#/<%= id %>/add_health" class="add_health"> add_health</a><br>
Strength: <%= strength %><a href="#/<%= id %>/add_strength" class="add_strength"> add_strength</a><br>
Make more stats: <a href="#/<%= id %>/add_stat" class="add_stat"> add 5 stat</a>

我可以把我的 If's 放在哪里?

  add_exp: (e) ->
    e.preventDefault()
    @model.save(experience: @model.attributes.experience+5)
    if @model.attributes.experience >= @model.attributes.level*30
      @model.save(level: @model.attributes.level+1, experience:     @model.attributes.experience-@model.attributes.level*30, stat: @model.attributes.stat+5)
    @model.on("change", () => this.render() )

【问题讨论】:

    标签: ruby-on-rails backbone.js coffeescript


    【解决方案1】:

    当你调用这两行时:

    @model.save(health: @model.attributes.health+1)
    @model.save(stat: @model.attributes.stat-1)
    

    无法保证哪个会先完成,调用可能会发送属性未更改的模型。

    相反,您应该将它们组合成一个保存调用:

    @model.save({health: @model.attributes.health+1, stat: @model.attributes.stat-1})
    

    这样,模型将同时保存两个更改,而不是对正在竞争的服务器的两个调用。

    另一个注释...

    我还将这一行 @model.on("change", () =&gt; this.render() ) 移动到视图上的 initialize 函数,并且不会在很多不需要它的地方复制它。我什至可以稍微改变一下语法……像这样:

    initialize: ->
      @listenTo @model, 'change', @render
    

    【讨论】:

    • 我编辑了我的帖子,最后是我的另一个活动,我怎样才能制作一个一直在寻找变化的活动?在哪里放置 IF 语句?因为现在我的 levelUp 工作正常,但是下一个加 5 点的调用仍然是错误的。
    • 问题是,你不能在调用保存后立即检查模型的属性。保存是一个异步调用。它不会等到保存完成才运行下一个命令。因此,当您保存属性以获取经验然后尝试检查 attributes.experience...时,您仍将拥有旧值。尝试使用一组。 model.set 'experience', model.attributes.experience + 5,然后调用 model.save {}。这会将属性设置为正确的值,并且保存可以将该值推送到服务器,同时仍然允许您访问更新的属性。
    • 是的,效果真的好多了,谢谢 :) 设置事件并在初始化时保存+渲染会更好吗?如果是,如何在初始化时保存模型?
    • 您可以监听模型更改事件并在每次更改时保存,但这有点奇怪。 listenTo model, 'change', some_function_that_saves_model_if_needed
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多