符号模型未找到其 url

Ampersand model not finding its url

我正在玩 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

根据规范:

默认情况下,url 是通过嗅探模型的 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,而是收到了 2 个带有 OPTIONS 和 PUT 的请求。如果我省略空对象 {} 参数,行为不会改变。尽管规范是这样说的:

book.save(); //=> 通过与符号同步触发 POST { "title": "The Rough Riders", "author": "Theodore Roosevelt" }

book.save({作者:"Teddy"}); //=> 通过与符号同步触发 PUT { "title": "The Rough Riders", "author": "Teddy" }

我想文档省略了很多细节。让它发挥作用的秘诀是什么?

感谢来自 Ampersand gitter chat 的 rick-butleraaronmccall 的回答:

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

在我没有独特 ID 的情况下,我喜欢将一个名为 fetched 的属性添加到我派生的 ampersand-model 的会话中。当我 fetch/retrieve 来自服务器的模型时,我设置了这个值。我将其用作我的 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;
    }
  }
});