В маршруте с моделью массива мне нужна пара сводных статистических данных. Эти сводные статистические данные необходимо обновлять на основе значений, введенных в числовые поля ввода. Я попытался реализовать это, установив их как вычисляемые свойства, используя @each в контроллере.
Свойства (creditTotal
и costTotal
) вычисляются при загрузке, но не обновляются, когда значения обновляются через поля ввода. К сожалению, их нужно обновлять, и я не знаю, как это сделать.
По общему признанию, я не являюсь разработчиком, работающим полный рабочий день, поэтому я благодарен за любую помощь и понимание, которые вы можете предложить.
06:40PST 03 января 2018 г .: я также поместил это в репозиторий 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('[email protected]', function(){
return this.get('model').mapBy('creditCost');
}),
costTotal: computed.sum('[email protected]', 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>
'[email protected]'
в вычисляемые свойства (computed.sum(here, '...', func...
). также, пожалуйста, покажите модель вашего маршрута! - person Jeff   schedule 03.01.2018computed.sum()
принимает только один аргумент, зависимый ключ. См. документацию. - person ykaragol   schedule 03.01.2018creditCost
иcost
. Следовательно, проблема связана сsum
, а не с вычисляемым свойством, отслеживающим другое вычисляемое свойство. - person knu2xs   schedule 03.01.2018this.get('model').sum('creditCost')
К сожалению, при этом я получаю сообщение об ошибкеTypeError: this.get(...).sum is not a function
. Я на правильном пути? Этот метод имеет для меня логичный смысл, но, похоже, не работает. Какие-нибудь мысли? - person knu2xs   schedule 03.01.2018