【问题标题】:Backbone - Passing the right model returned from fetchBackbone - 传递从 fetch 返回的正确模型
【发布时间】:2012-05-17 01:14:46
【问题描述】:

我有一个工作流的主干设置。在任何给定时间,页面上都可以看到多个工作流/模型。如果工作流尚未启动(即不在数据库中),它将显示为新模型。将获取的模型传递给视图时遇到问题。我只是传递属性而不是它看起来的集合?有人有什么想法吗?

当我从数据库中获取所有工作流时,它会返回一个工作流进度的 JSON 数组。

[{
        "ref_id": 41959,
        "parent_ref_id": 35,
        "fk_workflow_id": 2,
        "stage": 1,
        "status_max": 4,
        "updated": "2012-05-14 17:30:46"
}, {
        "ref_id": 41960,
        "parent_ref_id": 35,
        "fk_workflow_id": 3,
        "stage": 3,
        "status_max": 4,
        "updated": "2012-05-14 12:30:48"
}]

页面加载后,所有工作流都被创建为“新模型”,因为我们不知道它们是否已经启动。一旦 fetch 返回了已启动的模型,我必须将适当的模型传递给视图。我无法弄清楚如何正确传递模型(即我可以传递属性,但似乎在那之后,我无法访问 collection.create 函数等?)

    var self = this;
    this.workflows = new Workflow.WorkflowCollection();
    this.workflows.fetch({
        data:{
            ref_id: REF_ID
        },
        success: function(model, response) {
            for(var i = 0, ln = model.models.length; i< ln;i++) {
            self.switchWorkflow(model.models[i].get("fk_workflow_id"), new Workflow(model.models[i].attributes));
                }
            }
        });

这是我可以确定骨干知道需要设置多少模型的唯一方法(没有为每个客户启动每个工作流 - 大约 100 万行)

setupWorkflowSpaces: function(model) {

    for(var i =0; i<Workflow.FileWorkflows.length;i++) {
        this.switchWorkflow(Workflow.FileWorkflows[i], false);
    }
},
switchWorkflow: function(workflow_id, model) {
    if(!model)
        model = new Workflow;
    switch(workflow_id) {
        case 1:
            this.applicationProcessView(model);
            break;
        case 2:
            this.kitView(model);
            break;
        case 3:
            this.posView(model);
            break;
        default:
            alert('wut');
            break;
    }
},

kitView: function(model) {
    console.log(model);
    model.set("fk_workflow_id", 2);
    if(this.kit) this.kit.close();
    this.kit = new Workflow.PostageView({
        model: model
    });
},

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    尝试在您的 Backbone 集合中定义 model 属性:

    var Workflow.WorkflowCollection = Backbone.Collection.extend({
      model: Workflow
    });
    

    如果已定义,从您的服务器返回的原始属性将被转换为 Workflow 模型。

    那么您将不必遍历通过fetch 中的success 回调返回的集合。所有添加的模型都将在您的收藏中,您可以使用.create() 方法继续添加更多模型。

    获取后,您可以使用WorflowCollection.each 遍历更新的集合。在循环中,您可以运行 switch 语句将每个模型分配给适当的视图。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助!真的很感激。我的收藏确实将model 设置为Workflow,尽管我不知道我可以这样迭代!我已经将self.workflows.each(function(data) { self.switchWorkflow(data.get("fk_workflow_id"), data); }) 实施到fetch 的成功中,这似乎工作正常。但是,根据你所说,我应该初始化我的收藏,并添加新的,而不是为每个人制作新的模型?我只是遇到了adding 位的问题(创建运行POST,我现在还不想要)。我的代码在这里:jsfiddle.net/EtnzW/2
    • @Benno,我在这里更新了你的 jsfiddle:jsfiddle.net/EtnzW/3。看起来您正在像这样在代码中发送对象文字:model = this.workflows.add({model: new Workflow});Collection.add takes an array as its first argument 时。尝试类似这样的操作:model = this.workflows.add([new Workflow()]); 然后,您传递给视图的 model 也应该已经添加到您的集合中。
    • 澄清this.workflows.add({model: new Workflow}); 将创建一个新模型并将其添加到您的集合中。但是模型只有一个属性,model。你可能不想要model.model
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2020-12-17
    • 2023-03-18
    相关资源
    最近更新 更多