Backbone以正确的方式获取回调

ahm*_*111 11 javascript amd backbone.js

我的Backbone应用程序有一个名为schedule的视图,我对成功和错误调用正确函数的区别有点困惑,我尝试了下面列出的两个可能但我没有什么区别和什么是正确的从外部视图中放置的路由器调用函数的方法:

第一种方式:

        require([
            'app/collections/schedule',
            'app/views/schedule'
        ], function(ScheduleCollection, ScheduleView) {

           var scheduleCollection = new ScheduleCollection(),
            scheduleView = new ScheduleView({
                model: scheduleCollection
            });

            scheduleCollection.fetch({
                reset: true,                
                success: function(){
                    scheduleView.successHandler();
                },
                error: function(){
                    scheduleView.errorHandler()
                }
            });
        });
Run Code Online (Sandbox Code Playgroud)

第二种方式

        require([
            'app/collections/schedule',
            'app/views/schedule'
        ], function(ScheduleCollection, ScheduleView) {

           var scheduleCollection = new ScheduleCollection(),
            scheduleView = new ScheduleView({
                model: scheduleCollection
            });

            scheduleCollection.fetch({
                reset: true,                
                success: scheduleView.successHandler(),
                error: scheduleView.errorHandler()                  
            });
        });
Run Code Online (Sandbox Code Playgroud)

在scheduleView中

successHandler: function(){
   console.log('success');
}


erroHandler: function(){
   console.log('error');
}
Run Code Online (Sandbox Code Playgroud)

kin*_*uta 17

还有另一种选择:不是直接引用视图,而是将集合作为对相关视图的引用并监听相关事件.例如,在相关视图中侦听集合的重置.如果那不是您要挂钩的事件,则从您的视图可以侦听的成功/错误回调中触发自定义事件.

这是一个处理重置的示例 - 扩展您的ScheduleView:

var ScheduleView = Backbone.View.extend({ 

    initialize: function () {

        this.listenTo(this.collection, 'reset', this.handleReset);
    },

    handleReset: function () {
        // do whatever you need to do here
    }
};

var scheduleCollection = new ScheduleCollection();
var scheduleView = new ScheduleView({ collection: scheduleCollection });
Run Code Online (Sandbox Code Playgroud)

以下是与集合中的成功/错误处理程序关联的自定义事件的示例:

var ScheduleCollection = Backbone.Collection.extend({

    getResults: function () {

        var self = this;

        this.fetch({
            reset: true,
            success: function (collection, response, options) {
                // you can pass additional options to the event you trigger here as well
                self.trigger('successOnFetch');
            },
            error: function (collection, response, options) {
                // you can pass additional options to the event you trigger here as well
                self.trigger('errorOnFetch');
            }
        });
    }
 };

var ScheduleView = Backbone.View.extend({

    initialize: function () {

        this.listenTo(this.collection, 'successOnFetch', this.handleSuccess);
        this.listenTo(this.collection, 'errorOnFetch', this.handleError);
    },

    handleSuccess: function (options) {
        // options will be any options you passed when triggering the custom event
    },

    handleError: function (options) {
        // options will be any options you passed when triggering the custom event
    }
};

var scheduleCollection = new ScheduleCollection();
var scheduleView = new ScheduleView({ collection: scheduleCollection });
scheduleCollection.getResults();
Run Code Online (Sandbox Code Playgroud)

以这种方式连接的优点是可以删除集合对视图的依赖性.如果您希望多个视图监听集合(或您的集合模型)上发生的事件,并且是Backbone应用程序的更松散耦合的体系结构,这尤其重要.


McG*_*gle 5

第一种方法是正确的,第二种方式是不正确的.但这种方式最简洁:

scheduleCollection.fetch({
    reset: true,                
    success: scheduleView.successHandler,
    error: scheduleView.errorHandler
});
Run Code Online (Sandbox Code Playgroud)

(虽然......来自OP,但该功能scheduleView.successHandler不存在,因此可能存在问题.)