符号模型未找到其 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-butler 和 aaronmccall 的回答:
默认情况下,如果填充模型的 ID 属性,保存方法将 PUT
。 POST
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;
}
}
});
我正在玩 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-butler 和 aaronmccall 的回答:
默认情况下,如果填充模型的 ID 属性,保存方法将 PUT
。 POST
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;
}
}
});