1

尽管我发现与 Ember 相关的大多数指南和教程都非常关注使用绑定和观察者,但我也发现通过事件混合有选择地使用事件/订阅者模式的强大功能

所以在我得意忘形之前,或者开始偏爱一种模式而不是另一种模式之前,接受他们每个人都有自己的目的:

//This is Object to hold the ajax request (and fire the event)
App.serverAPI = Em.Object.createWithMixins(Em.Evented, {
    responseData : '',
    init: function(){
        //Make the request on second from now
        Em.run.later(this, function(){
            this.request();
        }, 1000);
        this._super();
    },
    //The 'ajax' request function
    request: function(myData){
        var self = this;
        $.ajax({
            url:'/echo/json/',
            type: 'POST',
            data: {
                json: JSON.stringify({"0":"Value One", "1": "Value Two", "2": "Value Three"}),
                delay: 3
            },
            success: function(data){
                console.log("Request successful ", data);
                self.set('responseData', data);
                self.trigger('responseSuccess', data);
            }
        })
    }
});

现在一个视图将使用观察者更新:

//This View gets it's value updated by Observing a changed value in an other object 
App.ObserverView = Em.View.extend({
    templateName: "observer",
    displayText: "Observer waiting...",
    responseDataHandler: function(){
        //Notice how we have to get the data here, where in a listener the data could be passed
        var data = App.serverAPI.get('responseData');
        //
        //...Run functions on the data
        //
        this.set('displayText', data[0]+", "+data[1]+", "+data[2]);
        console.log('Observer displayText', this.get('displayText'));
    }.observes('App.serverAPI.responseData')
});

另一个视图将使用订阅者更新:

//This View gets it's value updated by subscribing to an event in an other object 
App.SubscriberView = Em.View.extend({
    templateName: "subscriber",
    displayText: "Subscriber waiting...",
    init: function(){
        var self = this;
        App.serverAPI.on('responseSuccess', function(data){
            self.responseData(data);
        })
        this._super();
    },
    responseData: function(data){
        //
        //...Run functions on the data
        //
        this.set('displayText', data[0]+", "+data[1]+", "+data[2]);
        console.log('Subscriber displayText', this.get('displayText'));
    }
});

现在,虽然这个例子有利于观察者,但可以使用任何一种模式所以我的问题是:使用事件混合的性能优势和劣势(如果有)是什么以及使用的性能优势和劣势(如果有)是什么观察者?

4

1 回答 1

3

与使用观察者相比,使用事件混入的性能优势和劣势(如果有的话)是什么?

为了清楚起见,Ember.Eventedmixin 与 mixin 并没有真正的可比性,Ember.Observable因为它们提供了不同的功能。

Ember.Observable

这个 mixin 提供了属性和属性观察功能,它们是 Ember 对象模型的核心特性。属性和观察者允许一个对象观察另一个对象的属性的变化。这是模型、控制器和视图在 Ember 应用程序中相互通信的基本方式之一,所以你不能真的不使用它,因为它存在于从Ember.Object.

Ember.Evented

这个 mixin 允许 Ember 对象订阅和发出事件。您在需要某种自定义事件订阅架构的情况下使用此 mixin。使用这种混合来创建数据绑定机制并不是我想的重点,因为数据绑定已经由开箱即用的观察者机制提供。

所以总而言之,这里的选择不是使用观察者混合与事件混合,而是两者(如果你实现后者)以一种优雅的方式。

希望这可以帮助。

于 2013-08-04T11:58:50.690 回答