2015-01-17 2 views
0

У меня есть следующий яваскрипта модель данных:Как сменить события смены недвижимости?

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, кажутся очень трудными. Возможно, я не реализовал его правильно, но я подумал, что смогу использовать bind and trigger` в событии propertyChanged. Но это не сработало.

ответ

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 
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"; 

--- test change change --- ---
модель [UserDetail] измененная недвижимость:
свойства: Forename
старого значения: Дэвид
нового значение : Этан модель [UserDetail] извлекаться: Этан Boarman

Смежные вопросы