javascript - JavaScript - 修改属性/数据绑定时执行代码
问题描述
我正在尝试在 JavaScript 中构建一个简单的绑定框架。我希望有一个模型,getters
它setters
可以使所有内容保持一致,即更新一个属性会影响其他属性,然后是 JavaScript,然后将其绑定到页面中的字段。
我遇到的问题是我需要add
在绑定时为模型上的设置器添加一些额外的代码,以便更新属性执行设置器中已经存在的代码以保持模型一致,然后更新绑定的输入。
我考虑重命名现有属性并使用原始名称添加一个新属性,该属性可以设置原始属性并更新输入,但我看不到重命名字段的方法。
有没有办法用 getter/setter 重命名属性、修改 setter 或在 setter 中获取代码以便我可以复制它?
或者,还有其他方法可以实现我想要做的事情吗?
我试图在业务逻辑(模型)和 UI(html)之间保持分离,而不要求编写模型的人必须考虑 UI / 绑定。
我也不想使用任何像 Angular 或 Knockout 这样的大型库,因为它们需要在页面中包含大量代码以满足非常有限的要求,而且这是一个我们已经开发/维护了 20 年的项目+所以我们不想使用一个有大量重大变化(Angular)历史的库。
我们目前需要支持 IE10/11 和现代版本的 Chrome / Edge / Firefox / Safari(iOS 和 Mac)。但是,如果有些东西不支持所有这些,我们愿意做一个“好”的方式和一个“讨厌的”后备,直到我们可以放弃对 IE 的支持。
如果它有任何区别,我们正在使用TypeScript
编写 JavaScript。
编辑:自从提交我的问题以来,我发现了这个。它说您可以使用以下命令重命名属性:
Object.defineProperty(o, new_key, Object.getOwnPropertyDescriptor(o, old_key));
delete o[old_key];
这适用于重命名简单的变量类型属性,但不适用于使用 getter 和 setter 重命名属性。我不确定为什么,尽管当我hasOwnProperty
对它们执行 getter / setter 时,我的属性返回 false。
Edit2:原来 TypeScript 是针对原型而不是对象添加属性,这就是它们无法访问的原因。我打电话Object.getOwnPropertyDescriptor(o.__proto__, old_key)
给我,这给了我我需要的描述符。
解决方案
我发现您可以通过执行以下操作来编辑/扩展设置器:
var propDescriptor = Object.getOwnPropertyDescriptor(model, key);
propDescriptor.set = function (value) {
setter.call(model, value);
//Do extra stuff here
}
Object.defineProperty(model, key, propDescriptor);
这意味着该属性仍然保持一致性,同时允许您扩展它以更新绑定的输入字段。
推荐阅读
- python - Pandas 有条件地创建数据框列:基于多个条件最大值
- linux-kernel - 如何使用 libnl 和通用 netlink 发送多部分消息?
- nlp - 如何使用单词列表计算单词相似度
- axapta - 如何在 AX 2012 中获取特定主帐户的帐户结构?
- python - 如何使用 Python BS4 抓取 Shopify 产品信息
- python - Pandas - 相对于当前行的最近匹配
- sql - 每列 1 选择列 2 的最大值
- variables - [Python]变量中的字母什么时候大写?
- android - 如何从 webView 中删除缓存
- android - android studio,仅在真机上,“ADB 拒绝 shell 命令 (getprop): 关闭”“无法启动监控##”