술어가 무엇인지에 따라 observer pattern 구현에 문제를 적용 할 수 있습니다. 얼마 전 나는 creating JavaScript objects with observable properties에 대한 블로그 글을 썼다. 정말 술어 이 무엇인지에 따라 달라집니다, 그러나 이것은 다음과 같은 코드가 당신에게 대부분의 방법을 얻을 수 있습니다 : 물론
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
이 당신의 예를 들어 과잉 될 수 있습니다. (나는 아주 좋은 블로거 아니다 NB) 명시 적으로 밖으로 나와 결코 때문에, 여기에이 작품을 만드는 데 필요한 전체 코드입니다 :
var createMediator = function() {
var events = {};
return {
subscribe: function (eventName, callback) {
events[eventName] = events[eventName] || [];
events[eventName].push(callback);
},
publish: function (eventName) {
var i, callbacks = events[eventName], args;
if (callbacks) {
args = Array.prototype.slice.call(arguments, 1);
for (i = 0; i < callbacks.length; i++) {
callbacks[i].apply(null, args);
}
}
}
};
};
var createObservable = function (properties) {
var notifier = createMediator(), createObservableProperty, observable;
createObservableProperty = function (propName, value) {
return function (newValue) {
var oldValue;
if (typeof newValue !== 'undefined' &&
value !== newValue) {
oldValue = value;
value = newValue;
notifier.publish(propName, oldValue, value);
}
return value;
};
};
observable = {
register: function (propName, value) {
this[propName] = createObservableProperty(propName, value);
this.observableProperties.push(propName);
},
observe: function (propName, observer) {
notifier.subscribe(propName, observer);
},
observableProperties: []
};
for (propName in properties) {
observable.register(propName, properties[propName]);
}
return observable;
};
내 관찰 객체
만들을 내부적으로 작은 이벤트 처리 프레임 워크합니다 (createMediator 기능)의 사용 나는 한 번 프로젝트에 썼다. 다시 말하지만,이 또는 당신의 필요를 위해 과도하지 않을 수 있습니다 (
전에! 오 D'. jQuery를 사용자 정의 이벤트를 지원 실현),하지만 난 그게 재미있는 해킹 생각했다. 즐겨!
술어 란 무엇입니까? – SLaks
@predicate는 function이고 action도 function입니다. – zaharpopov
술어는 조치가 호출되기 전에 참이어야하는 조건입니다. ** ==> ** 나에게 소리가납니다. – AxelEckenberger