Ampersand模型未找到其网址

时间:2015-11-26 19:51:55

标签: javascript backbone.js ampersand.js

我正在玩Ampersand JS模型。当我尝试初始化新的时,

z.add(this.state)
m = z.get(this.state.name)
m.sync()

或将一个添加到集合中,

m = new ZModel(this.state)
m.sync()

我收到错误A "url" property or function must be specified

根据规范:

默认情况下,通过嗅探模型的urlRoot或模型的集合URL(如果存在)构建url,然后在尚未保存模型的情况下附加idAttribute。

这正是我想要的行为,因为我有一个与之同步的RESTful API。 urlRoot已设置,idAttribute也已设置。

export default Model.extend({

  idAttribute: 'name',

  urlRoot: 'http://localhost:50000/locator/zones/',

  props: {
    name: 'string',
    type: 'string',
  },

  fetch () {
    Model.prototype.fetch.apply(this, arguments)
  }
})

定义了一个集合,但我没有将它传递给模型,因为我无法从文档中找出如何做到这一点。但据说只要我urlRoot定义,它就没有必要。该怎么办?我想我可以将集合传递给模型,或以某种方式以编程方式定义url?

更新

如果我这样做:

m.save({}, {
  success: function(model, response) {
    console.log('Rerender now')
  }.bind(this),
  error: function() {
    console.log('Error during model add')
  }
})

我不再遇到同样的问题,但是我没有获得POST,而是通过OPTIONS和PUT获得了2个请求。如果省略空对象{}参数,则行为不会改变。即使规范说明了这一点:

book.save(); // =>触发POST通过&符号与{"标题":"粗糙的骑手","作者":" Theodore Roosevelt&#34 ; }

book.save({author:" Teddy"}); // =>通过与"标题":"粗糙的骑手","作者":" Teddy"触发PUT通过&符号同步}

我想文档中省略了很多细节。让这个工作起作用的秘诀是什么?

1 个答案:

答案 0 :(得分:1)

感谢来自Ampersand gitter的 rick-butler aaronmccall 的回答:

默认情况下,如果填充了模型的ID属性,则保存方法将为PUTPOST vs PUT / PATCH取决于默认情况下模型是否具有ID。实际逻辑来自isNew()中的ampersand-state函数。您可以重载此函数以确定自己的逻辑,或者在选项中手动传递首选方法。

如果我没有独特的ID,我想在我的派生fetched的会话中添加一个名为ampersand-model的属性。当我从服务器获取/检索模型时,我设置了这个值。我将其用于我的isNew值,并将其用作子视图的waitFor属性。

var Model = require('ampersand-model');

module.exports = Model.extend({
  constructor: function(){
    options || (options = {});
    Model.apply(this, arguments);
    this.onSync = this.onSync.bind(this);
    this.on('sync', this.onSync);
  },
  isNew: function(){
    return this.fetched;
  },
  session:{
    fetched: ['boolean', true, false],
  },
  onSync: function (model, resp, options) {
    if (options.xhr.method == "GET") {
      this.fetched = true;
    }
  }
});