11

我正在尝试在我的主干模型上设置一个变体获取方法,该方法将为给定用户获取当前模型。这可从 API 上获得/api/mealplans/owner/{username}/current

我写了以下模型。我注释掉了 URL Root,因为原型 fetch 调用只是使用了urlRoot,我想看看它是否覆盖了我以某种方式传入的 url 参数。

var mealPlan = Backbone.Model.extend({
  name: 'Meal Plan',
  //urlRoot: '/api/mealplans',
  defaults: {},
  fetchCurrent: function (username, attributes, options) {
    attributes = attributes || {};
    options = options || {};
    if (options.url === undefined) {
      options.url = "/api/mealplans/owner/" + username + "/current";
    }
    return Backbone.Model.prototype.fetch.call(this, attributes, options);
  },
  validate: function (attributes) {
    // To be done
    return null;
  }
});

我已经看到这样做了,在其他地方的一些变化中,例如在主干.js 使用不同的 url 进行模型保存和获取- 在这种情况下,代码略有不同(我从它开始并将其分解以使其更容易供我阅读。)

当我将选项对象传递给 fetch 时,选项对象中的 url 参数很好,但它似乎忽略了它!

4

2 回答 2

16

我假设要获取与保存相同的参数 - 事实并非如此。

fetch 的方法签名只接受“选项”而不是“属性”,因此找不到 url 参数。

模型代码应该看起来更像这样..

   var mealPlan = Ministry.Model.extend({

        name: 'Meal Plan',
        urlRoot: '/api/mealplans',

        defaults: {
        },

        fetchCurrent: function (username, options) {
            options = options || {};
            if (options.url === undefined) {
                options.url = this.urlRoot + "/owner/" + username + "/current";
            }

            return Backbone.Model.prototype.fetch.call(this, options);
        },

        validate: function (attributes) {
            // To be done
            return null;
        }
    });
于 2013-08-22T14:29:59.810 回答
1

我认为最好覆盖 url() 方法,如下所示:

 var mealPlan = Ministry.Model.extend({

    name: 'Meal Plan',
    urlRoot: '/api/mealplans',

    //--> this gets called each time fetch() builds its url
    url: function () { 
        //call the parent url()
        var url=Backbone.Model.prototype.url.call(this);
        //here you can transform the url the way you need
        url += "?code=xxxx";
        return url;
    }
 ...

此外,在你上面的例子中,我认为有一个错误,你应该用fetch替换fetchCurrent

于 2016-04-27T04:47:34.667 回答