2012-03-16 26 views
10

Gần đây tôi đang đánh giá một khung JavaScript sẽ được sử dụng cho dự án tiếp theo của chúng tôi. Tôi thực sự thích Ember. Nhưng trong ứng dụng của chúng ta, chúng ta sẽ cần một cơ chế eventing từ lớp dữ liệu để thông báo cho lớp điều khiển rằng một cái gì đó đã thay đổi. Tôi biết người ta có thể sử dụng obersevers trong Ember, ví dụ ,:EmberJs có hỗ trợ xuất bản/mẫu đăng ký sự kiện không?

person.addObserver('fullName', function() { 
    // deal with the change 
}); 

Nhưng tôi thích hơn trong Backbone.Events mà bạn có thể đăng ký hoặc công bố một sự kiện, cụ thể:

var object = {}; 

_.extend(object, Backbone.Events); 

object.on("alert", function(msg) { 
    alert("Triggered " + msg); 
}); 

object.trigger("alert", "an event"); 

Bất kỳ ai có một ý tưởng cho dù đó là doable trong EmberJS?

Để cung cấp cho bạn một số thông tin cơ bản về câu hỏi của tôi, ứng dụng của chúng tôi là một ứng dụng thời gian thực. Vì vậy, theo thời gian, dịch vụ RESTful phụ trợ sẽ kích hoạt một sự kiện cho phía máy khách (bên JavaScript). Tôi muốn có một lớp dữ liệu gói gọn quyền truy cập vào dịch vụ RESTful phụ trợ, nhưng cũng giữ một bộ nhớ cache. Tôi hy vọng EmberJS.Data có thể giúp tôi với điều đó (đó là một câu hỏi riêng biệt mà tôi muốn tìm câu trả lời). Với điều đó, tôi cũng muốn bộ nhớ cache được cập nhật bất cứ khi nào có thay đổi xảy ra từ dịch vụ RESTful phụ trợ. Khi đối tượng cache được cập nhật, tôi muốn lớp Controller được thông báo. Đây là lý do tại sao tôi cần một số cơ chế eventing ở phía JavaScript.

Lưu ý rằng lý do tôi không muốn sử dụng Trình quan sát là đôi khi, sự kiện có thể có nghĩa là tôi phải thực hiện hành động, tức là tải tin nhắn hoặc cho biết cuộc gọi thoại đang đến. Cách xương sống dường như natuarl hơn với tôi.

Cảm ơn

Trả lời

11

Kể từ khi cam kết 2326580 - trong đó có sẵn từ v0.9.6 - có một Ember.EventedMixin, xem http://jsfiddle.net/qJqzm/.

var handler = Ember.Object.create({ 
    otherEvent: function() { 
     console.log(arguments); 
    } 
}); 

var myObject = Ember.Object.create(Ember.Evented, { 
    init: function() { 
     this._super(); 
     this.on('alert', this, 'alert'); 
    }, 
    alert: function() { 
     console.log(arguments); 
    } 
}); 
myObject.on('otherEvent', handler, 'otherEvent'); 

myObject.fire('alert', { 
    eventObject: true 
}); 
myObject.fire('otherEvent', { 
    first: true 
}, { 
    second: true 
});​ 
8

Nếu bạn muốn một trung tâm xuất bản/đăng ký mục đích chung, bạn có thể tận dụng kích hoạt/bật từ Sự kiện (như pangratz đã nói) bằng một cú pháp nhỏ. Đây là những gì tôi đang làm:

 
App.Hub = Ember.Object.create({ 
    init: function(){ 
    this.set('HUB', Ember.Object.createWithMixins(Ember.Evented, {})); 
    }, 

    publish: function(){ 
    var hub = this.get('HUB'); 
    return hub.trigger.apply(hub, arguments); 
    }, 

    subscribe: function(){ 
    var hub = this.get('HUB'); 
    return hub.on.apply(hub, arguments); 
    } 
}); 

Sau đó, để sử dụng nó trong ứng dụng của bạn:

 
App.Hub.subscribe('test-started', function(name){ 
    console.log("Test " + name + " started"); 
}); 

... 

App.Hub.publish('test-started', 'Biology I'); 
App.Hub.publish('test-started', 'Calculus'); 
+0

Làm thế nào tôi có thể bỏ đăng ký từ một sự kiện sử dụng giải pháp của bạn? – Parzifal

+0

@Parzifal, thêm phương thức "hủy đăng ký" tương tự như "đăng ký" gọi http://emberjs.com/api/classes/Ember.Evented.html#method_off thay vì "bật". Sau đó bạn có thể sử dụng nó như 'App.Hub.unsubscribe ('test-started')'. – digitalbreed

Các vấn đề liên quan