如何通过代理从代码中更新对象属性来更新输入值?

Posted

技术标签:

【中文标题】如何通过代理从代码中更新对象属性来更新输入值?【英文标题】:How to update input's value by updating object's property from the code thanks to a proxy? 【发布时间】: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);
&lt;input id="title" type="text"&gt;

当然,直接影响objProxy.title 可以工作,并更新输入的值。

但我预计对obj.title 的影响也会更新输入的值。事实并非如此,即使objProxy.title 发生了变化,正如我们在日志中看到的那样。

如何通过代理从代码中更新对象的属性来更新输入的值?

更准确地说,可以写obj.title = X;吗?

【问题讨论】:

***.com/questions/45490004/…的可能重复 @AsukaSong - 您链接的问题的答案是实现它的简单解决方案,但我没有看到关于代理的提及。但也许我走错路了? @JamesWasson - 我明白了。因此,仅使用代理无法实现我想要实现的目标。感谢您的评论(这应该是一个答案)。 评论已删除并移至回答部分——对此感到抱歉。 @KévinBibollet 是的,这是不可能的:除非您只在代码中存储对代理的引用。 【参考方案1】:

这里的一切似乎都按预期工作。更详细一点——设置 obj.title 时不会运行代理代码,因为它不是代理。您直接在对象本身上设置值。代理基本上是为了包装对象,那么您应该只使用代理引用而不是实际对象本身。没有真正的方法可以绕过这个限制,因为它是代理所固有的并且是按照这种方式设计的。

【讨论】:

以上是关于如何通过代理从代码中更新对象属性来更新输入值?的主要内容,如果未能解决你的问题,请参考以下文章

Proxy(vue响应式原理:数据侦测--数据劫持和数据代理)

如何仅更新 MongoDB 数据库中对象的某些属性

ubuntu 中如何配置代理设置是apt-get update能直接下载更新

VUE前进之路使用数据代理,计算属性与监视属性的妙用

Fluent nHibernate 保存或更新派生实体

从背景音频代理更新动态磁贴?