gpt4 book ai didi

javascript - 纯 Javascript 双向数据绑定(bind)

转载 作者:可可西里 更新时间:2023-11-01 01:42:58 25 4
gpt4 key购买 nike

出于好奇和增长我的知识,我想在 dom 元素和 javascript 变量之间实现某种双向数据绑定(bind)。

我很幸运能够在这里@stackoverflow 找到一个很好的答案来解决我的一半问题,这让我想到了这个要点 https://gist.github.com/384583 ,但我仍然无法 100% 完成这件事。

这是我的代码示例: http://jsfiddle.net/bpH6Z/

如果您尝试运行 fiddle 并单击“查看值”,您将得到未定义,而我想获得对象属性的实际值。

由于我缺乏使用 javascript 的经验,我可能做错了什么,但是你知道为什么我在调用 _bind() 和 _watch() 之后无法正确读取属性“secret”吗?

免责声明:正如我所说,我这样做是因为我想更好地了解 javascript,而且我不会编写我的框架。所以任何“使用 FRAMEWORK X”都是完全没用的,因为我可以用 angularjs 完成工作。

最佳答案

请尝试http://jsfiddle.net/bpH6Z/4/

我已经更新了您在 Object.prototype.__watch 中重新定义的 getter/setter,目前您的处理程序也需要返回新值。

更新:现在您的处理程序不需要返回新设置的值。

当前代码:

//Got this great piece of code from https://gist.github.com/384583
Object.defineProperty(Object.prototype, "__watch", {
enumerable: false,
configurable: true,
writable: false,
value: function(prop, handler) {
var val = this[prop],
getter = function() {
return val;
},
setter = function(newval) {
val = newval;
handler.call(this, prop, newval);
return newval;
};

if (delete this[prop]) { // can't watch constants
Object.defineProperty(this, prop, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
}
});

var Controller = function () {
//The property is changed whenever the dom element changes value
//TODO add a callback ?
this._bind = function (DOMelement, propertyName) {
//The next line is commented because priority is given to the model
//this[propertyName] = $(DOMelement).val();
var _ctrl = this;
$(DOMelement).on("change input propertyChange", function(e) {
e.preventDefault();
_ctrl[propertyName] = DOMelement.val();
});

};

//The dom element changes values when the propertyName is setted
this._watch = function(DOMelement, propertyName) {
//__watch triggers when the property changes
this.__watch(propertyName, function(property, value) {
$(DOMelement).val(value);
});
};
};

var ctrl = new Controller();
ctrl.secret = 'null';
ctrl._bind($('#text1'), 'secret'); // I want the model to reflect changes in #text1
ctrl._watch($('#text2'), 'secret'); // I want the dom element #text2 to reflect changes in the model
$('#button1').click(function() {
$('#output').html('Secret is : ' + ctrl.secret); //This gives problems
});

当前的 HTML:

<html>
<head></head>
<body>
value: <input type="text" id="text1" /><br />
copy: <input type="text" id="text2" /><br />
<input type="button" id="button1" value="View value"><br />
<span id="output"></span>
</body>
</html>

关于javascript - 纯 Javascript 双向数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11904039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com