Как вызвать события изменения свойства?

У меня есть следующая модель данных 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, кажутся очень сложными. Возможно, я не реализовал это должным образом, но я думал, что смогу использовать bindandtrigger` для события «propertyChanged». Но это не сработало.


person IAbstract    schedule 17.01.2015    source источник


Ответы (2)


Я не думаю, что это еще в 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< /strong>, но если вы посмотрите на MDN, они говорят, что это не рекомендуется использовать.

Примечание.  Если вы хотите использовать Observe с node, это недоступно в текущей стабильной версии nodejs, но вы можете использовать node v0.11.*, которая поддерживает эту функцию. .

Если вы используете node v0.11, убедитесь, что ваша программа запущена как

node --harmony filename.js
person Mritunjay    schedule 17.01.2015

Немного позаимствовав парадигму 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";

--- тестовое событие изменения свойства ---
модель [UserDetail] свойство изменено:
свойство :forename
старое значение :David
новое значение :Ethan модель [UserDetail] получено: Ethan Boarman

person IAbstract    schedule 17.01.2015