Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干模型.save()导致POST未放置_Backbone.js - Fatal编程技术网

Backbone.js 主干模型.save()导致POST未放置

Backbone.js 主干模型.save()导致POST未放置,backbone.js,Backbone.js,我有一个主干模型: var User = Backbone.Model.extend({ idAttribute: '_id', url: '/api/user', defaults: { username: '' } }); 我去拿: var user = new User(); user.fetch(); 现在,作为我的一个视图中的单击事件,我有以下内容: toggleSubscription: function () { user.set('sub

我有一个主干模型:

var User = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});
我去拿:

var user = new User();

user.fetch();
现在,作为我的一个视图中的
单击事件,我有以下内容:

toggleSubscription: function () {
  user.set('subscriptions', true);
  user.save();
}

这会导致POST请求。但是,该记录已经存在于服务器上,由于我获取了它(并且模型实例具有
id
属性),我认为主干应该执行PUT而不是POST。为什么它会改为发帖子?

尝试检查
user.isNew()

看起来您创建了一个没有ID的新模型,这就是为什么它试图在
Backbone.sync
期间添加它

更新:

以上是完全正确的。它确实发布了
POST
,因为它是一款新机型(也就是说,它没有id)。在获取模型之前,您需要为其提供一个id。在您的示例中:

var user = new User();
user.fetch();
user.save(); // in XHR console you see POST

var user = new User({ id: 123 });
user.fetch();
user.save(); // in XHR console you see PUT

服务器响应必须采用以下方式:

{
  _id : 111
}
因为您将_id设置为主键。获取模型时,请验证_id的值,该值必须为: console.log(model.get(“u id”))

我的想法是,您在主干模型中设置了“\u id”作为主键,但服务将返回“id”

更新:添加正常行为的示例代码:

var UserModel = Backbone.Model.extend({
  idAttribute: '_id',

  url: '/api/user',

  defaults:
    { username: ''
    }
});
user = new UserModel({_id : 20});
user.save();
user = new UserModel();
user.save();
输出: PUT/api/user 405(不允许使用方法) POST/api/user 404(未找到)


检查模型的第一个实例如何具有id,并且它尝试执行PUT而不是其他POST。我无法重现您的问题,因此我认为问题出在您的服务器响应上。

可能值得检查“可能”是否正确。这将使用添加的
\u方法
标题更改所有投递内容(您可能还需要检查是否存在此标题以确认想法)

如果模型还没有id,则认为它是新的--

如果模型还没有id,则认为它是新的。。。因此主干网将执行
PUT
请求,而不是
POST

只需将
类型:“POST”
添加到保存块中,即可覆盖此行为:

var fooModel = new Backbone.Model({ id: 1});

fooModel.save(null, {
  type: 'POST'
});

使用urlRoot属性设置基本URL
/api/user
。然后

  • 当您保存没有
    \u id
    属性集的模型时,它将发布到
    /api/user
  • 当您保存具有
    \u id
    属性集的模型时,它将置于
    /api/user/{{u id}
    。请注意,它会自动将
    \u id
    值附加到基本URL

  • 它将查找
    \u id
    属性的值,因为您已将该值设置为
    idAttribute

    正常,但该id正在从服务器获取。在获取用户ID之前,我不知道该用户的ID。那么我应该把什么作为身份证呢?我已经检查过,一旦它被获取,
    id
    user
    的一个属性和属性
    isNew
    等于
    false
    。您能解释一下吗?@OliverJosephAsh不,当您尝试获取新模型时,不会从服务器获取id。只有在获取集合时,您的模型才会加载ID。我不明白:(实例化
    User
    时分配ID与获取用户并获取ID有什么区别?如果您有用户ID,并且执行
    User=new User({ID:123})
    fetch将起作用-没有id,它始终是一个新模型。正如我所说,当您获取集合时,它会加载带有id的模型。但是当您使用
    new User()
    -它会创建一个新的用户模型,现在您只能保存它(通过POST)-在这种情况下,它将从服务器端获取id并返回id POST成功后,将更新此新用户模型。之后,您可以执行user.save()操作,它将执行PUT操作。在获取时,您希望主干如何知道要加载哪个模型?阅读此内容-您始终使用get获取,因此您始终需要id:
    Read→ GET/collection[/id]
    (型号相同)。考虑一下,在服务器端,当您从数据库中读取特定记录时,您需要主键。此处相同。我已将其设置为选择使用
    \u id
    model.GET(“\u id”)
    返回ID,与
    model.ID一样。我更新了我的答案,尝试了你的用例,使用了你的模型,但我无法重现你的问题。你能将原始服务器响应粘贴到这里吗?我想是有问题的。把它放在toggleSubscriptions中:console.log(user.toJSON())和console.log(user.isNew());并将结果粘贴到此处我猜应该是“将执行POST请求而不是PUT”,因为我们使用POST方法添加新对象,并使用PUT方法更新或修改它们