【问题标题】:Backbone.js two models affecting each otherBackbone.js 两个模型相互影响
【发布时间】:2013-03-13 16:19:18
【问题描述】:

我有一个表,它的行是集合中的模型,每行有两列输入,每小时费率和小时数,模型也有属性total,基本上只是rate_per_hour*hours,它正在更新为用户更改小时数或每小时费率。您也可以添加新行并删除它们。这一点,我相信,我设法做到了正确的主干方式。

现在我不确定第一部分,我需要一个包含小时和总和的 div,我也设法做到了这一点,使用一个函数(它基本上只是通过集合中的模型循环,总和他们的属性,然后使用 jquery 更新我的 div),更改模型上的事件,在设置新属性后,正在调用此函数。它在所有视图/集合/模型之外。不确定这是否是正确的做法,但它确实有效。

现在最糟糕的部分是我惨败,意识到我的代码可能从一开始就错了。在带有总计的 div 下是另一个输入,称为折扣,它应该做的是计算折扣百分比((value of discount/my total sum)*100),然后更新表中的费率,以便显示旧的和应用了折扣的费率。

这里的实际问题:

我不明白的是,我应该如何将底部(总计和折扣 - 见截图)与上部连接起来,底部是否应该是另一个模型,具有属性总计、折扣和小时数,并拥有它自己视图而不是一个简单的 div?但是它是如何工作的,一个模型(折扣)如何影响集合中的模型,反之亦然,添加一行需要影响总数和折扣百分比?

这是我尚未使用骨干网的纯 jquery 版本应该如何工作的屏幕截图。

如果需要也将发布代码,但现在我尝试使用 jquery 事件、包含这些总数和 shizzle wizzle 的我自己的简单对象来解决它有点臃肿。

【问题讨论】:

  • 问题真的是“我为什么需要 2 个模型”吗?请记住,您可以拥有使用来自相同模型的数据并相应地使用数据的单独视图。
  • 不,我绝对不介意有两个模型,我只是 1)不知道这些“总数”是否应该是模型 2)集合的变化如何影响该模型,反之亦然, “折扣”的变化如何影响收集中的数据

标签: javascript jquery model-view-controller backbone.js underscore.js


【解决方案1】:

您遇到的问题似乎是数据建模。有时退后一步问问自己“我正在处理的事情是什么?”会有所帮助。

您提到的每一行似乎都代表一个“活动”(每行都有一个名称和速率)。您还收集了这些活动,这很好。现在你可能会问,“这整个 ui(由整个屏幕截图表示)代表什么?”。如果我们将这段 ui 称为 ActivitiesView,它可以监听 UI 交互(更改字段),这将更新集合。一旦集合发生变化,它会触发视图重新渲染更新后的总数。

在此示例中,集合上的折扣字段只是为了方便,集合使用它来更新其子项。

var Activity = Backbone.Model.extend({
    defaults: { discount: 0 }
});

var ActivityCollection = Backbone.Collection.extend({
    initialize: function () {
        this.on("change:discount", this.updateDiscounts, this);
    },
    model: activity,
    totalAmount: function () { /* ...iterate over items, return total amount, factoring in total */ },
    totalHours: function () { /* ...iterate over items, return total hours... */ },
    updateDiscounts: function (discount) { /* ...iterate over items, updating each item's discount */}
});

var ActivitiesView = Backbone.View.extend({

  events: {
    "change input.discount": "applyDicsounts"
  },

  initialize: function() {
    this.listenTo(this.collection, "change", this.render);
    this.listenTo(this.model, "change", this.render);
  }

  render: function() {
    this.$el.find('.totalAmount').text(this.collection.totalAmount());
    this.$el.find('.totalHours').text(this.collection.totalHours());  
  },

  applyDicsounts: function (e) {
    var new_discount = e.target.value; // should probably validate this
    this.collection.set({ discount: new_discount });
  }

});

var myCollection = new ActivityCollection();
var myActivitiesView = new ActivitiesView({ collection: myCollection });

【讨论】:

  • 是的,这绝对是问题所在,另一个是我像昨天一样开始玩 Backbone。无论如何,每一行只是代表数据库中的条目,它的模型结构就是{rate:1200,hours:10},选择框更新条目的速率(每个活动都有不同的速率)。它还有另一个带有人的选择框,但为了简单起见,将其删除。那么模型可以将集合作为属性吗?好的,所以我有一个模型项目,{dicount: 0, total:0, entries: new EntriesCollection}?那么“折扣”的变化将如何影响集合中的模型?
  • 按照我的想法,“折扣”字段仅适用于“项​​目”模型,因此根据项目总数(不是每个单独的项目)计算。如果您想以这种方式关联它们,则活动的 DB 模型可以包含与其关联的“项目”的外键(像 Rails 这样的框架会更容易)。
  • 显然我很讨厌解释我想要做什么。无论如何,每个条目的可见率折扣是必须的,这对于应用程序的运行至关重要。后端也很好。我要做的几乎都是为了视觉效果,所以用户可以实时看到这些数字是如何变化的,因为他添加了新行、更改活动、更改小时输入中的数字。再次,需要发生的是总计(当前费率 * 小时数)相加 -> 折扣率计算(折扣值/总计总和) -> 循环通过条目并应用折扣(显示新旧 val) - > 新费率总和
  • 也是要设置的,在这个下面还有一个类似的表,总和是由这两个表的总和组成的,另一个表是没有折扣的,只有一个输入,所以它会是更容易,但我仍然需要决定这个总数是否会成为另一个模型......
  • “好的,所以我有模型项目,{dicount: 0, total:0, entries: new EntriesCollection}?那么“折扣”的变化会如何影响集合中的模型?模型只是总是通过引用调用的对象,所以它总是会在那一刻更新集合。您可以通过添加“更改”事件在集合中做一些事情(即在更改特定模型时更改其他人的值)。如果您考虑一下,您永远不会将总数硬编码到 Excel 电子表格中,对吗?它将由许多其他单元格(标量变量)的值生成。
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2023-03-18
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多