2015-01-17 3 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에서 찾은 관찰자 라이브러리는 모두 매우 어려워 보입니다. 어쩌면 제대로 구현하지 못했지만 "propertyChanged"이벤트에서 bind and trigger`를 사용할 수있을 것이라고 생각했습니다. 하지만 그건 효과가 없었습니다.

답변

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을 살펴 보려면 사용하지 않는 것이 좋습니다.

참고 : - 당신이 nodejs의 현재 안정 버전은 사용할 수 없습니다 nodeObserve를 사용할 수 있지만이 노드 v0.11 갈 수 *이 기능을 지원을합니다..

당신이 node v0.11를 사용하는 경우는 C#을 패러다임의 약간의 대출

node --harmony filename.js 
0

로 프로그램을 실행해야합니다, 나는 해결책을 알아 냈어. UserDetail하지만 나는 다음과 같은 프로토 타입 한 다른 모델을 사용 :

user_detail.__proto__.propertyChange = null; 
user_detail.__proto__.notify = function(args){ 
    if(user_detail.propertyChange !== null){ 
     user_detail.propertyChange(args); 
    } 
}; 

... 다음 모델의 속성 setter에서 :

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] 속성이 변경되었습니다.
특성 : 데이비드
새로운 가치 : 에단 모델 [UserDetail] 검색 : 에단 Boarman를


이전 값을 뒤따라야