@each不更新计算的总和值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@each不更新计算的总和值相关的知识,希望对你有一定的参考价值。

在具有数组模型的路由中,我需要一些可用的摘要统计信息。需要根据键入数字输入字段的值更新这些摘要统计信息。我试图通过在控制器中使用@each将它们设置为计算属性来实现它。

属性(creditTotalcostTotal)在加载时计算,但在通过输入字段更新值时无法更新。不幸的是,他们需要更新,我不知道如何实现这一目标。

不可否认,我不是一名全职开发人员,所以我很感激您提供的任何帮助和见解。

0640PST 03Jan2018:我也把它放在一个GitHub回购(https://github.com/knu2xs/arcgis-credit-calculator)中,希望能让任何慷慨的人更容易用它们的时间仔细看看它。

以下是从控制器开始的相关文件。

// ./app/controllers/index.js

import Controller from '@ember/controller';
import { computed } from '@ember/object';

export default Controller.extend({
  creditTotal: computed.sum('model.@each.creditCost', function(){
    return this.get('model').mapBy('creditCost');
  }),
  costTotal: computed.sum('model.@each.cost', function(){
    return this.get('model').mapBy('cost');
  })
});

接下来,引用的模型。

// ./app/models/credit-object.js

import DS from 'ember-data';
import { computed } from '@ember/object';

const _creditCost = 0.1;

export default DS.Model.extend({

  name: DS.attr('string'),
  description: DS.attr('string'),
  creditRate: DS.attr('number'),
  unitRate: DS.attr('number'),
  units: DS.attr('number', { defaultValue: 0 }),

  rate: computed('creditRate', 'unitRate', function(){
    return Number(this.get('creditRate')) / Number(this.get('unitRate'));
  }),
  creditCost: computed('rate', 'units', function(){
    return this.get('rate') * this.get('units');
  }),
  cost: computed('creditCost', function(){
    return this.get('creditCost') * _creditCost;
  }),
});

和路线。

// ./app/routes/index.js

import Route from '@ember/routing/route';

export default Route.extend({
  model() {
    return this.get('store').findAll('credit-object');
  }
});

最后,模板,所以它有希望有一定道理。

<table class="table table-striped table-sm">
  <thead>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Credit Rate</th>
    <th scope="col">Unit Count</th>
    <th scope="col">Credit Count</th>
    <th scope="col">Cost</th>
  </tr>
  </thead>
  <tbody>
  {{#each model as |creditObject|}}
    <tr>
      <td>{{creditObject.name}}</td>
      <td>{{creditObject.rate}}</td>
      <td>{{input type='number' value=creditObject.units}}</td>
      <td>{{format-floating-point creditObject.creditCost}}</td>
      <td>{{format-currency creditObject.cost}}</td>
    </tr>
  {{/each}}
  <tr class="table-primary">
    <td>Total</td>
    <td></td>
    <td></td>
    <td>{{format-floating-point creditTotal}}</td>
    <td>{{format-currency costTotal}}</td>
  </tr>
  </tbody>
</table>
答案

我最终通过大量的试验和错误找到了解决方案。虽然不是最优雅,但这最终适用于Ember.js版本2.18。

creditArray: computed('model.@each.creditCost', function(){
  return this.get('model').mapBy('creditCost');
}),
creditTotal: computed.sum('creditArray')

我偶然发现了一个增强请求,讨论了这些类型函数的链接,因此它可能会变成这样的东西。

this.get('model').mapBy('creditCost').sum()

目前这不起作用,但我绝对希望它在未来!

另一答案
creditArray: computed('model.@each.creditCost', function(){
  return this.get('model').mapBy('creditCost');
}),
creditTotal: computed.sum('creditArray')

我偶然发现了一个增强请求,讨论了这些类型函数的链接,因此它可能会变成这样的东西。

this.get('model').mapBy('creditCost').sum()

目前这不起作用,但我绝对希望它在未来!

你必须区分computed property macros(例如computed.sum)和native javascript array functions(例如mapBy)。以上是不可能的,因为javascript中没有可用的sum函数,但可以使用reduce轻松实现。

this.get('model').mapBy('creditCost').reduce((res, val) => res + val)
另一答案

试试这个:

// ./app/controllers/index.js

import Controller from '@ember/controller';
import { computed } from '@ember/object';

export default Controller.extend({
  creditTotal: computed.sum('model.@each.{units}', function(){
    return this.get('model').mapBy('creditCost');
  }),
  costTotal: computed.sum('model.@each.{units}', function(){
    return this.get('model').mapBy('cost');
  })
});

使用'{'它应该可以正常工作

以上是关于@each不更新计算的总和值的主要内容,如果未能解决你的问题,请参考以下文章

2016搜狐笔试二叉树和最大的子树

从片段向数据库中插入值时ListView不更新

如何快速计算 UInt16 值数组的总和?

使用具有 for_each 集的模块的输出值

如何计算行值相对于其他行值的差异总和,特别是使用窗口函数不包括该行

我可以用 JS 在另一个 td 中获取 td 值和输入值的总和吗?