我有一个locker
对象,有一堆字段和一个lots
对象数组 - 都是通过props
传入的。对于 locker 对象,其中一个字段包含id
数组中特定lot
的{{1}}。像这样:
lots
locker: { locker_num: 'AH3', part_of_lot: '235', allocation: '' , etc...}
对象是一个对象数组,结构为:
lots
我正在尝试向用户提供一个表单来编辑lots: [
{ id: '234', sl_num: '567', etc... },
{ id: '235', sl_num: '567', etc... },
{ id: '236', sl_num: '567', etc... },
{ id: '237', sl_num: '567', etc... },
... etc
]
对象。对于locker
字段,我想提供part_of_lot
输入。这是我的代码:
select
这可以按预期工作 - 但只有在 <select class='form-control' v-model='locker.part_of_lot.id'>
<option disabled value=''>Choose a Lot</option>
<option v-for='l in lots' :selected="l.id === locker.part_of_lot.id" :value='l.id'>{{ l.sl_num }}</option>
</select>
的{{1}}字段中已有值时才会生效。如果我的part_of_lot
字段为空locker
,则上述操作失败。错误是locker
。
那么我如何设置part_of_lot
输入来处理这两种情况:1)当Cannot read property 'id' of null
已经有值时2)当select
为空时?
修改
如果我创建的方法只检查part_of_lot
值是否为part_of_lot
,如果是,则将其更改为字符串part_of_lot
,则上述代码可以正常工作。但这似乎是一个笨拙的工作。难道不应该有一个更优雅的方式来处理这个?我觉得在其他模型上可能有很多很多其他字段,其值null
需要在模板中处理。
答案 0 :(得分:0)
如果通过道具传递part_of_lot,您可以为它设置默认值:
props: {
part_of_lot: {
type: String,
default: ""
}
}
您还可以在数据中添加新字段:
{
data: function (){
return {
new_part_of_lot: this.locker.part_of_lot || "";
}
}
}
然后使用new_part_of_lot而不是part_of_lot。
答案 1 :(得分:0)
您可以使用partOfLotID
和get
方法创建计算属性set
,引用locker.part_of_lot
对象并处理null
值的大小写:
computed: {
partOfLotID: {
get() {
let part = this.locker.part_of_lot;
return (part) ? part.id : '';
},
set(value): {
let part = this.locker.part_of_lot;
if (part && typeof part === 'object') {
this.locker.part_of_lot.id = value;
} else {
this.locker.part_of_lot = { id: value };
}
}
}
}
然后只需在partOfLotID
中使用select
:
<select class='form-control' v-model='partOfLotID'>
<option disabled value=''>Choose a Lot</option>
<option
v-for='l in lots'
:selected="l.id === partOfLotID"
:value='l.id'
>
{{ l.sl_num }}
</option>
</select>
答案 2 :(得分:0)
我使用的解决方案是使用一种方法检查part_of_lot
的值,如果它为null,则将其更改为""
。像这样:
created () {
this.setToStrings()
},
methods: {
setToStrings () {
// Simply replaces null values with strings=''
if (this.locker.part_of_lot === null) {
this.locker.part_of_lot = ''
}
return this.locker
},