Backbonejs确定哪个函数返回了从模型到视图的响应

时间:2015-10-01 16:44:37

标签: javascript backbone.js marionette backbone-views backbone-events

我有一个 view.js 和一个名为 user.js 的模型

user.js

define( function ( require, exports, module )
{
    "use strict";

    var Backbone = require( 'backbone' );

    return Backbone.Model.extend({
        defaults: {
            flush: false
        },

        doRejectBatch: function( batchId, flushToConveyer ){
            this.functionName = 'doRejectBatch';
            this.flush = flushToConveyer;

            this.fetch({
                type: 'GET',
                url:'http://api.com/reject/' + id +'/rej',
                xhrFields: {
                    withCredentials: true
                }
            });
        },

        doPatchBatch: function( batchuuid ){
            var patchData = {
                "status": "rejected",
                "jobs_to_conveyer": this.flush
            };

            this.fetch({
                type: 'PATCH',

                url: 'http://api.com/api/rej/' + uuid,
                contentType: 'application/json',
                data: JSON.stringify(patchData),
                xhrFields: {
                    withCredentials: true
                }
            })
        }
    });
} );

当一个函数完成时,我的 view.js 中的onSync函数被调用。

 onSync: function ( rawData, response ){

        var msg = "Reject Request: successfull";

        app.regionMessage.show(new  MessageView({
            model: new Backbone.Model({
                msg_type: response[0].status,
                msg: msg
            })
        }));

    }

});

如何在 view.js onSync函数中确定从模型发送哪些函数响应?换句话说,是doRejectBatch函数使用的还是来自doPatchBatch函数的响应?请注意,view.js实际上是控制器,而不是视图

2 个答案:

答案 0 :(得分:1)

在MVC世界中,您的视图不应该对模型有任何了解:您的控制器应该负责将模型映射到View,反之亦然。实际上,如果没有比Backbone提供的更严格的框架模型,这可能很难实施,但如果你现在解耦这些概念,从长远来看你会更快乐。

所以,让我们重新解释你的问题。而不是:

  

如何在view.js onSync函数中确定哪些函数响应是从模型发送的?换句话说,是使用了doRejectBatch函数还是来自doPatchBatch函数的响应?

短语如下:

  

如何在lessRows <- which(df1$col1 < df2$col2) df3 <- merge(df1, df2)[lessRows, ] 期间确定要显示的正确消息?在MVC世界中,你会做类似的事情:

  • 型号:致电onSyncdoRejectBatch。在这些方法中,设置doPatchBatchstatus标记。
  • 控制器:绑定到模型的state事件,或者仅关注它关注的属性(syncstatus
  • 控制器:在控制器的 state处理程序(不是视图)中,使用适当的状态呈现更新的视图(例如,调用onSync方法或类似方法,仅显示消息所需的信息。根据您的要求,可能不是整个模型或响应对象;它可能只是一个状态指示器。)

您可能还希望探索其他设计,如MVP或MVVM。根据您的应用程序的要求和复杂性,其中一种模式可能比传统的MVC更适合您。

答案 1 :(得分:0)

您可以触发模型中每个函数的不同事件,例如:this.trigger('reject:batch')和this.trigger('patch:batch')。然后,您的视图中会有一个不同的处理函数,例如

this.model.on('reject:batch',function(){/ *批处理拒绝的特定处理程序代码* /);