我正在玩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
通过&符号同步}
我想文档中省略了很多细节。让这个工作起作用的秘诀是什么?
答案 0 :(得分:1)
感谢来自Ampersand gitter的 rick-butler 和 aaronmccall 的回答:
默认情况下,如果填充了模型的ID属性,则保存方法将为PUT
。 POST
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;
}
}
});