Backbone如何在模型中进行不同的GET和POST请求?

时间:2015-08-04 07:50:42

标签: backbone.js

我有一个团队视图和一个团队模型,当我实例化团队视图时,我需要请求一个团队列表,用于模拟一个团队选择框使用/团队,我想知道我是怎么做的这是因为我不确定这个实际要求应该去哪里?我可以从一个URL获取然后POST到模型中的另一个URL吗?以下是一些代码片段:

国家/地区JSON

/支

[
    {
        "name": "Arsenal",
        "nickname": "Gunners"
    },
    {
        "name": "Manchester United",
        "nickname": "Red Devils",
    }
]

团队模型

module.exports = Backbone.Model.extend({

    url: '/team'

    defaults: {
        'name': '',
        'badge': '',
        'nickname': '',
        'city': ''
    },

    initialize: function() {

    },

    validate: function() {

    }
});

制作我的新观点

var teamView = new TeamView({
  model: new TeamModel() // but where does my teams request go?
});

1 个答案:

答案 0 :(得分:1)

在Backbone中,假设你有一个模型类型。

var MyModel = Backbone.Model.extend({ ... });

该类型的一个属性是url,另一个属性是id,它是服务器上的id

var MyModel = Backbone.Model.extend({
    url: function() { return '/api/item/' + this.get('id'); }
})

如果您想GET为其定义网址的模型,请致电fetch

var MyModel = Backbone.Model.extend({ ... });
var model = new MyModel();

fetch您的模型没有id之前,它被视为“新”模型。在fetch您的模型有id后,它被视为“现有”模型。

如果要创建或更新模型的更改,请致电save。如果是新的,它将POST model.url();如果更新,PUT model.url()

var MyModel = Backbone.Model.extend({ ... });
var model = new MyModel();
model.set('somethingToSave','theValueToSaveToServer');
model.save();

完成保存后,它将转到sync事件处理程序。

var MyModel = Backbone.Model.extend({
              ...
              sync: function() { alert('yay!); }
              });
var model = new MyModel();
model.listenTo('sync','onSync',this);
model.set('somethingToSave','theValueToSaveToServer');
model.save(); // finishes with onSync

如果你想更仔细地控制它,你可以这样称呼它......

model.save({
    keyA: this.get('keyA'),
    keyB: this.get('keyB')...
}, {
    success: function() { alert('success'); },
    error: function() { alert('error'); }
});

修改

在你的评论中,你问:

  

“我在哪里可以请求/团队,因为这是一个不同的宁静网址   与我将用于发布团队数据的/ team url相比?“

是的,我应该更仔细地阅读你的问题。

最简单的方法是在其中一个调用中明确设置urlfetchsave / sync

model.url = function() {
    var suffix = '/' + this.id || ''; 
    return '/teams' + suffix; 
};
model.savingUrl = function() { return '/team'; };

model.save({
    a: this.get('a'),
    b: this.get('b')
}, {
    url: function() { return this.savingUrl(); },
   ...
});