1

我正试图围绕 Backbone(正如我最近的一系列问题所表明的那样......)。特别是我正在完成这个项目:

https://github.com/ccoenraets/nodecellar http://nodecellar.coenraets.org/#

我想从概念上理解当我单击新葡萄酒上的“保存”按钮时会发生什么,例如这个:

http://nodecellar.coenraets.org/#wines/506df6b6849a990200000001

我在想它是这样的:

1) Backbone winedetails 视图将保存按钮单击作为事件捕获并启动“保存前”方法。请参阅下面的 /public/js/views/winedetails.js。

beforeSave: function () {
    var self = this;
    var check = this.model.validateAll();
    if (check.isValid === false) {
        utils.displayValidationErrors(check.messages);
        return false;
    }
    this.saveWine();
    return false;
},

saveWine: function () {
    var self = this;
    console.log('before save');
    this.model.save(null, {
        success: function (model) {
            self.render();
            app.navigate('wines/' + model.id, false);
            utils.showAlert('Success!', 'Wine saved successfully', 'alert-success');
        },
        error: function () {
            utils.showAlert('Error', 'An error occurred while trying to delete this item', 'alert-error');
        }
    });
},

在该 Save 方法(第二种方法)中,调用了 this.model.save。正如 server.js 文件中所证明的那样,模型保存方法必须向“/ wines” URL 发出 PUT 请求(这是针对 node.js 服务器):

app.get('/wines', wine.findAll);
app.get('/wines/:id', wine.findById);
app.post('/wines', wine.addWine);
app.put('/wines/:id', wine.updateWine);
app.delete('/wines/:id', wine.deleteWine);

显然它从那里运行在 routes/wines.js 中定义的 addWine 方法。我不明白的是 MODEL 如何理解将请求发送到哪个 URL。我找不到将 model.save 方法与正确的 REST API 链接的任何地方。我的问题有意义吗?

4

2 回答 2

1

这是模型 urlRoot 的文档:http: //backbonejs.org/#Model-urlRoot

如果您urlRoot在模型上指定了,它将使用它。如果模型是集合的一部分,它将引用集合上的url属性。

保存时,Backbone 将使用 PUT 进行更新,使用 POST 进行创建。它根据isNew函数的结果确定应该使用哪个。这将检查模型是否具有 id 属性。

于 2013-09-09T18:46:57.510 回答
1

等等,我可能已经回答了我自己的问题。它必须是这一行:/public/js/models/models.js

urlRoot: "/葡萄酒"

然后 Backbone 知道你是否在做一个“新”模型,它必须发送一个 POST 请求。如果您要进行更新,则必须将 :id 附加到 URL 并发送 PUT 请求等。它是这样工作的吗?

于 2013-09-09T18:07:01.433 回答