【发布时间】:2019-10-25 21:49:04
【问题描述】:
我正在尝试在对象和输入之间建立一个简单的数据绑定系统,这要归功于代理。
这是我创建的变量:
-
obj,一个带有title属性的简单对象。 -
titleInput,<input#title>DOMElement。 -
objProxy,一个包装了obj的Proxy对象实例。
然后,我正在处理两种行为:
- 当输入的值发生变化时,新的值需要影响到对象的属性。
- 当对象的属性发生变化时,新的值需要更新输入的值。
第一部分效果很好:将事件侦听器附加到更新代理相应属性的输入就足够了。
然而,第二个并没有像我预期的那样工作。见以下代码sn -p:
// variables
const obj = {
title: 'my title'
},
titleInput = document.querySelector('#title');
// proxy
const objProxy = new Proxy(obj, {
get: (obj, prop) => (Reflect.get(obj, prop)),
set: (obj, prop, val) => {
if (prop === 'title') titleInput.value = val;
return Reflect.set(obj, prop, val);
}
});
// input event listener
titleInput.addEventListener('change', () => {
objProxy.title = titleInput.value;
log('Input update');
});
// initialization
titleInput.value = obj.title;
// start
log('Init log');
objProxy.title = 'title from objProxy';
log('objProxy code update');
obj.title = 'title from obj';
log('obj code update');
// log function
function log(mess) {
console.log('');
console.log(`---${mess}---`);
console.log('obj.title:', obj.title);
console.log('objProxy.title:', objProxy.title);
console.log('<#title> value:', titleInput.value);
}
<input id="title" type="text">
当然,直接影响objProxy.title 可以工作,并更新输入的值。
但我预计对obj.title 的影响也会更新输入的值。事实并非如此,即使objProxy.title 发生了变化,正如我们在日志中看到的那样。
如何通过代理从代码中更新对象的属性来更新输入的值?
更准确地说,可以写obj.title = X;吗?
【问题讨论】:
-
@AsukaSong - 您链接的问题的答案是实现它的简单解决方案,但我没有看到关于代理的提及。但也许我走错路了?
-
@JamesWasson - 我明白了。因此,仅使用代理无法实现我想要实现的目标。感谢您的评论(这应该是一个答案)。
-
评论已删除并移至回答部分——对此感到抱歉。 @KévinBibollet 是的,这是不可能的:除非您只在代码中存储对代理的引用。
标签: javascript html data-binding proxy