Javascript 在敲除中设置变量值的最短方法
在Knockout中,我有一个可观察变量Javascript 在敲除中设置变量值的最短方法,javascript,knockout.js,observable,Javascript,Knockout.js,Observable,在Knockout中,我有一个可观察变量位置。它的类型为LocationEdit。此viewModel具有可观察字段和非可观察字段 我有一组字段名:字段。对于每个字段,我要重置位置的值 fields.forEach(field => { if (this.uniqueField(locs, field)) { if (ko.isObservable(this.location()[field])) { this.locati
位置
。它的类型为LocationEdit
。此viewModel具有可观察字段和非可观察字段
我有一组字段名:字段
。对于每个字段,我要重置位置的值
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
if (ko.isObservable(this.location()[field])) {
this.location()[field](locs[0][field]);
} else {
this.location()[field] = locs[0][field];
}
}
});
为了使此代码更简单(删除if子句),我是否可以在一行中将值设置为this.location()[field]
您可以使用条件运算符(…?…;
),尽管它变化不大:
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
ko.isObservable(this.location()[field]) ? this.location()[field](locs[0][field]) : this.location()[field] = locs[0][field];
}
});
或者您可以编写一个函数:
function upd(arr, index, val) {
ko.isObservable(arr[index]) ? arr[index](val) : arr[index] = val;
}
用法:
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
upd(this.location(), field, locs[0][field]);
}
});
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
ko.updatePotentialObservable(this.location(), field, locs[0][field]);
}
});
请参见
您甚至可以将此函数添加到ko
:
if(typeof ko.updatePotentialObservable == 'undefined')
ko.updatePotentialObservable = function (arr[index], val) {
ko.isObservable(obj) ? arr[index](val) : arr[index]= val;
}
用法:
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
upd(this.location(), field, locs[0][field]);
}
});
fields.forEach(field => {
if (this.uniqueField(locs, field)) {
ko.updatePotentialObservable(this.location(), field, locs[0][field]);
}
});
请参阅其他老实说,我认为的答案肯定是您最好的选择。基本上,您希望创建一个类似于但设置了一个值的实用函数
但既然你说“还想找到另一个解决方案”,这里有一个不同的效用函数。我认为代码中最令人困惑的部分是返回对locs[0][field]
和this.location()[field]
的调用。我想要有这个签名的东西:
reset(source, target, keys);
因此,在代码中,您可以执行以下操作:
reset(
this.location(),
locs[0],
fields.filter(f => this.uniqueField(locs, f))
);
现在,在写这个方法的时候,我得出了这样的结论:
const mergePropsObs=(函数(){
//返回用于在对象中设置特定属性的方法
常量getSetter=obj=>prop=>ko.isObservable(obj[prop])
?obj[道具]
:val=>obj[prop]=val;
//返回两个对象的唯一键
//(我选择了一个快速的单列;有很多方法可以做到这一点)
常量所有键=(obj1,obj2)=>
key(Object.assign({},obj1,obj2));
返回值(基本值、外部值、仅返回值)=>{
const props=onlyProps | | allkey(base,ext);
常量值=props.map(p=>ko.unwrap(ext[p]);
道具
.map(getSetter(基))
.forEach((setter,i)=>setter(value[i]);
};
}());
var base={a:1,b:ko.可观测(2),c:5};
哭泣(
基础
{a:2,b:3},
[“a”、“b”];
控制台日志(base.a);
console.log(base.b());
控制台日志(base.c)代码>
是的,当然可以,但我也想再找一个solution@demo否则您可以创建函数,在其他情况下可能会派上用场(请参见答案更新)快速注意:您的upd
方法无法工作,因为它无法访问原始对象。它需要是函数upd(obj,key,val){ko.isObservable(obj[key])?obj[key](val):obj[key]=val;}