我在和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是通过嗅探模型的urlRoot或模型的集合url (如果存在)来构造的,如果模型尚未保存,则追加idAttribute。
这正是我想要的行为,因为我有一个restful来同步。设置了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')
}
})我不再有同样的问题了,但我没有得到一个帖子,我收到了两个选项的请求和抛出。如果省略空对象{}参数,则行为不会改变。尽管规范说:
book.save();//=>通过与{“标题”:“Rough Riders”、“作者”:"Theodore Roosevelt“}的符号同步触发POST。
Book.save({作者:“泰迪”});//=>通过与{“标题”:“粗糙骑士”、“作者”:“泰迪”}同步的方式触发PUT。
我想文档忽略了很多细节。让这件事成功的秘诀是什么?
发布于 2015-12-07 15:06:45
感谢rick和来自Ampersand聊天的aaronmccall的回答:
默认情况下,如果填充了模型的ID属性,则保存方法将是PUT。POST与PUT/PATCH的区别在于模型在默认情况下是否具有ID。实际的逻辑来自ampersand-state中的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;
}
}
});https://stackoverflow.com/questions/33946087
复制相似问题