按自定义属性加载 Backbone 个模型

Loading Backbone model by custom attribute

比方说,我有以下 Backbone 模型:

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

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

myMeal.fetch();

我的模型从服务器加载。 现在一切都清楚了,我的问题是,如果我在后端有另一个方法将字符串作为参数并将 return 作为 responsebody,正确的 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 调用。

您可以覆盖默认提取,拦截调用,进行一些验证,然后传递到原始提取:

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 也没有主菜的新餐点的情况。

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
});