在RESTFul应用程序中使用Backbone.js克隆资源的最佳实践是什么?

时间:2013-08-29 14:48:41

标签: javascript rest backbone.js

我正在尝试找出使用Backbone.js和RESTful架构克隆资源(本例中为Request)的场景的最佳方法。

当用户克隆某些资源时,应该出现一个对话框,在该对话框中可以为Request键入新名称并设置新的DeadlineDate,所有其他字段必须从其他Request中克隆。对话框中显示的名称应类似于请求名称(克隆1),其中数字应为已创建的副本数。

以下代码表示我的设计方式:

var RequestModel = Backbone.Model.extend({
    url: '/path/to/request',
    idAttribute: "Id",
    defaults: {
        Name: '',
        DeadlineDate: '',
        // loads of other options
        Content: '',
        Documents: []
        TeamMembers: []
    }
})

// Request View
var RequestView = Backbone.View.extend({
    events: {
        'click .btn-clone': 'clone'
    },
    clone: function(e){
        var id = $(e.target).closest('.request').data('request-id'),
            referenceModel = new RequestModel({ Id: id  });

        // with the clone true param the server should append
        // to the Name of the Request: (Clone *Number*)
        referenceModel
            .on({ 'sync': this.renderCloneDialog }, this)
            .fetch({ data: { clone: true } });
    },
    renderCloneDialog: function(model){
        // create a brand new instance of the model
        // with the previous values
        var clonedRequest = model.toJSON();
            clonedModel = new RequestModel( _.omit(clonedRequest, 'Id')  );

        // send the cloned from id so the server use as reference
        clonedModel.set('ClonedFromRequestId', clonedRequest.get('Id'));

        var clonedRequestDialog = new CloneRequestDialogView({
            model: clonedModel
        });
    }
});

// Request View
var CloneRequestDialogView = Backbone.View.extend({
    // the method for saving will be just saving 
    saveClone: function(){
        // update data based on the form
        // and save the model
        this.model.save();
    }
});

这是克隆工作方式的工作流程:

  1. 用户点击克隆。
  2. 使用url param clone: true获取请求。这将返回附加克隆'克隆Numnber'
  3. 的请求名称
  4. 将打开一个对话框,用户可以在其中输入一些数据。
  5. 将创建一个没有Id的新模型,并使用父Request设置一个新属性。例:ClonedFromRequestId: 123
  6. 保存这个新模型。
  7. 我不知道这是否是这种情况的最佳做法。

0 个答案:

没有答案