按自定义属性加载Backbone模型

时间:2015-04-23 22:04:29

标签: backbone.js

让我们说,我有以下Backbone模型:

var Meal = Backbone.Model.extend({
defaults: {
"appetizer":  "caesar salad",
"entree":     "ravioli",
"dessert":    "cheesecake"
},
urlRoot : api/meals,
idAttribute : id, 
// some other stuff
});

假设我有一个后端Spring MVC控制器拦截GET请求,所以当我获取我的模型时,使用

myMeal.fetch();

我的模型从服务器加载。 现在一切都很清楚,我的问题是,如果我在后端有另一个方法,它接受一个字符串作为参数并返回作为响应体,右边的json元素。 我如何从我的模型中拨打电话? 我正在寻找这样的东西:

var meal = new Meal({'entree': 'value'});
meal.fetch({
 // if there is no id, and 'entree' is given, I want to call   /  
 //  api/findByEntree passing this.entree as parameter. 
});

我想通过在Backbone模型中指定url来从对象本身到后端进行Ajax调用。

2 个答案:

答案 0 :(得分:1)

您可以覆盖默认提取,拦截通话,执行一些验证,然后转到原始提取:

var Meal = Backbone.Model.extend({
    fetch: function(options) {
        if(this.has('id')) {
          Backbone.Model.prototype.fetch.call(this, options);
        } else {
          this.findByEntree(options);
        }
    },
    fetchByEntree: function(options) {
        ...
    }
});
但是,请记住,您需要一些额外的逻辑来处理尝试获取新膳食的情况,该膳食既没有ID也没有主菜。

答案 1 :(得分:1)

urlRoot可以是一个函数,因此无需覆盖fetch。我相信你可以做这样的事情:

var Meal = Backbone.Model.extend({
    defaults: {
        "appetizer": "caesar salad",
        "entree": "ravioli",
        "dessert": "cheesecake"
    },
    urlRoot : function() {
         return 'api/' + this.get('id') ? 'meals' : 'findByEntree';
    },
    idAttribute : id, 
    // some other stuff
});