我正在开发一个 nativescript vue 应用程序,您可以在其中保存付款和与此付款相关的 X 人,您可以为每个人指定自定义金额,当您保存全部时,为每个人指定的自定义金额的总数人数必须等于顶部指定的总金额。
我使用了 ObservableArray 来保持更新界面,正如我用来显示人员列表和相关字段的 RadListView 的 nativescript 文档中所示。
两个问题:
- 当我按下按钮添加一个人时,一个新项目会被推送到 ObservableArray 中,其中包含一些默认数据。如果我为这个新人插入一个名字和一个自定义数量,然后我按下删除按钮,ObservableArray 它会正确更新,但是当我再次按下添加人按钮时,它会使用新的默认数据更新数组,但在由生成的界面上RadListView 再次插入了先前的值,与 ObservableArray 中存在的值不匹配。
事实上,当我按下保存按钮时,控制台日志向我显示了一个数组,其中包含由 addPerson 函数创建的默认数据集,但在界面上,我看到了在按下删除按钮之前插入的值的字段。
- 当按下保存按钮时,validateForm 函数计算所有人员自定义金额的总和,如果不等于总金额,则显示错误对话框。似乎 ObservableArray 中第一项的自定义金额值(从一开始就已经存在的那个)它正确地打算作为数字,而不是插入到由 add person 函数动态生成的字段中的所有自定义金额值都打算作为字符串.
事实上,当我按下保存按钮并计算总和时,例如 14 和 16 的总和产生的结果将是“1416”而不是 30。我当然可以在执行总和之前将字符串转换为浮点数,但我不'不明白为什么需要这种解决方法。
这是完整的代码:
<template>
<Page>
<GridLayout columns="*" rows="auto,auto,*,auto,auto">
<Label row="0" text="total amount"/>
<TextField row="1" v-model="payment.total" keyboardType="number" @textChange="updatePrice()"/>
<RadListView row="2" layout="linear" orientation="vertical" for="item in payment.persons">
<v-template>
<GridLayout columns="*" rows="*,*,*,*,*,*,*" class="person">
<Label row="0" :text="'person name ' + ($index+1)" />
<TextField row="1" v-model="item.name" />
<Label row="2" :text="'person amountEqual ' + ($index+1)" />
<Label row="3" :text="item.amountEqual" />
<Label row="4" :text="'person custom amount ' + ($index+1)" />
<TextField row="5" v-model="item.customAmount" keyboardType="number" />
<Button row="6" text="Delete person" @tap="deletePerson($index)"/>
</GridLayout>
</v-template>
</RadListView>
<Button row="3" text="Add person" @tap="addPerson()" />
<Button row="4" text="Save" @tap="validateForm()" />
</GridLayout>
</Page>
</template>
<script>
import { ObservableArray } from 'tns-core-modules/data/observable-array';
export default {
data() {
return {
payment:{
total:10,
persons: new ObservableArray([{
name:"test1",
amountEqual:10,
customAmount:10
}])
}
}
},
methods:{
updatePrice(){
for (let index = 0; index < this.payment.persons.length; index++) {
var equalCost = (this.payment.total / this.payment.persons._array.length).toFixed(2)
this.updateArray(index,"amountEqual",equalCost);
}
},
updateArray(index,property,value){
var temp= this.payment.persons.getItem(index);
temp[property]=value;
this.payment.persons.setItem(index, temp);
},
addPerson(){
this.payment.persons.push({
name:"",
amountEqual:0,
customAmount:0
});
this.updatePrice();
},
deletePerson(index){
this.payment.persons.splice(index, 1);
this.updatePrice();
},
validateForm(){
var customTotal=0;
for (let index = 0; index < this.payment.persons.length; index++) {
var person = this.payment.persons.getItem(index);
customTotal = customTotal + person.customAmount;
}
console.log(this.payment.persons);
console.log(customTotal);
if(this.payment.total != customTotal){
alert({
title: "Error",
message: "The total of the custom amount of the persons is not equal to the payment total amount!",
okButtonText: "OK"
});
}
}
}
}
</script>
<style scoped>
.person{
margin-top:50px;
background-color: rgb(231, 231, 231);
border-radius: 10px;
padding: 40px 10px;
margin-bottom: 50px;
}
</style>
感谢您的帮助!