我有以下javascript数据模型:
function User(uid, usr_name, usr_pwd, usr_enbld) {
var id = uid == null ? uuid.v4() : uid;
var name = usr_name;
var password = usr_pwd;
var enabled = usr_enbld;
Object.defineProperty(this, "id", {
get: function () {
return id;
}
});
Object.defineProperty(this, "name", {
get: function () {
return name;
},
set: function (value) {
name = value;
}
});
Object.defineProperty(this, "password", {
get: function () {
return password;
},
set: function (value) {
password = value;
}
});
Object.defineProperty(this, "enabled", {
get: function () {
return enabled;
},
set: function (value) {
if (!value instanceof Boolean) {
// log - type error, must be true/false
return;
}
enabled = value;
}
});
}
我试图找出在更改其中一个属性时如何引发事件。我为nodejs找到的观察者库似乎都很困难。也许我没有正确实现它,但我认为我可以在“propertyChanged”事件中使用bind and
trigger`。但那没用。
答案 0 :(得分:1)
我还没有想到它在ECMAScript中,但后来它们会提供像Object.observe这样的东西,它会将对象绑定到一个函数。
如果您使用chrome 36
或更高版本,则应该可以在控制台中使用它。
// Let's say we have a model with data
var model = {};
// Which we then observe
Object.observe(model, function(changes){
// This asynchronous callback runs
changes.forEach(function(change) {
// Letting us know what changed
console.log('Printing Changes.');
console.log(change.type, change.name, change.oldValue);
});
});
现在,如果您要添加,删除或修改模型的属性,它将调用该函数。
您可能希望查看watch,但如果您查看MDN,他们会建议不要使用此功能。
注意:如果您想将Observe
与node
一起使用,则在当前稳定版本的nodejs中不可用,但您可以选择节点v0。 11。* ,支持此功能。
如果您使用node v0.11
,请确保以
node --harmony filename.js
答案 1 :(得分:0)
借用一点C#范例,我想出了一个解决方案。使用不同的模型,虽然UserDetail
我已经制作了以下原型:
user_detail.__proto__.propertyChange = null;
user_detail.__proto__.notify = function(args){
if(user_detail.propertyChange !== null){
user_detail.propertyChange(args);
}
};
...然后在模型的属性设置器中:
set: function (value) {
if(forename !== value){
var args = {
property: "forename",
old: forename,
new: value
};
forename = value;
this.notify(args);
}
}
单元测试和以下输出:
var propChanged = false;
usrDetails.propertyChange = function(data){
console.log("model [" + usrDetails.constructor.name + "] property changed:");
console.log(" property :" + data.property);
console.log(" old value :" + data.old);
console.log(" new value :" + data.new);
propChanged = true;
};
usrDetails.forename = "Ethan";
---测试属性变化事件---
model [UserDetail]属性已更改:
财产:姓 旧价值:大卫
新的价值 :Ethan模型[UserDetail]检索:Ethan Boarman