Tùy thuộc vào vị từ là gì, bạn có thể phù hợp với vấn đề của mình trong việc triển khai observer pattern. Một thời gian ngắn tôi đã viết một bài đăng blog về creating JavaScript objects with observable properties. Nó thực sự phụ thuộc vào những gì các vị là, nhưng điều này có thể giúp bạn có được hầu hết các cách đó với mã như thế này:
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
Tất nhiên, điều này có thể là quá mức cần thiết ví dụ của bạn. Kể từ khi nó chưa bao giờ được liệt kê ra một cách rõ ràng (nb Tôi không phải là một blogger rất tốt), đây là mã hoàn chỉnh cần thiết để thực hiện công việc này:
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;
};
đối tượng quan sát của tôi sử dụng trong nội bộ của một khuôn khổ eventing nhỏ (chức năng createMediator) Tôi đã viết một lần cho một dự án. (Trước khi nhận ra các sự kiện tùy chỉnh được hỗ trợ của jQuery. D'oh!) Một lần nữa, điều này có thể hoặc có thể không vượt quá nhu cầu của bạn, nhưng tôi nghĩ đó là một bản hack thú vị. Thưởng thức!
Nguồn
2010-02-19 14:01:37
Vị từ là gì? – SLaks
@predicate là hàm, hành động cũng là hàm – zaharpopov
Vị từ là điều kiện khi điều đó phải đúng trước khi hành động được gọi. ** ==> ** Tìm âm thanh cho tôi. – AxelEckenberger