如何筹集房产变更事件?

时间:2015-01-17 04:06:34

标签: javascript node.js propertychanged

我有以下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`。但那没用。

2 个答案:

答案 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,他们会建议不要使用此功能。

注意:如果您想将Observenode一起使用,则在当前稳定版本的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