backbone.js RelationalModel关系字段在作业完成后为NULL

oug3syen  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(139)

我遇到了一个我想不通的问题。我解释道:
我有一个名为Product的模型:

var Product = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        user_id: null,
        is_buy_it_now: ''
    },

    relation: [{
        type: Backbone.HasOne,
        key: 'user_id',
        relatedModel: User,
        autoFetch: true
    }]
});

我的字段user_id是一个用户的外键(它也是 Backbone 网中的模型):

var User = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    }
});

我的fetch关系在每个单独的模型中都能很好地工作,但是当我在Product.user_id和User模型之间放置一个关系时,出现了wtf错误。
我试过所有可能的方法:所有的键(keySourcekeyDestination............所有可能的值)。我甚至在关系库中设置了断点,以便能够观察发生了什么......没什么好说的。甚至StackOverflow都不知道这个bug:P(或者我搜索得不好)
最后的问题是:

  • 我的产品已由API正确发送并设置在 Backbone.js 中(正常)。
  • 字段user_id首先由Product API响应设置为一个数字,然后由Relational设置为NULL,而不是由对象User替换(为什么?)
  • 当我观看我的网络调试器时,Relational使用user_id数字调用User对象的API(这里都是)(OK)。服务器响应很好,使用JSON格式的正确用户(OK)。但是Relational没有将这个响应对象与字段user_id绑定,现在是.... NULL(NOT OK)。
  • 因此,我丢失了一个User对象(但如果我在autoFetch中放置了一个success函数,我可以使用console.log()),没有正确链接到其带有字段user_id的父产品。
    **EDIT:**此处提供了一个JSFiddle http://jsfiddle.net/gjdass/WNWrm/(请注意,API的响应时间可能会很长,大约10秒,这是正常的)。

提前感谢:/抱歉占用您的时间。

j5fpnvbx

j5fpnvbx1#

如果删除user_id的默认值,它的行为会有什么不同吗?我想知道它是否在获取关系,然后应用null的默认值。
如果尚未将Backbone.Relational.showWarnings设置为true,您也可以尝试将其设置为true,并检查控制台是否有任何警告。

rseugnpd

rseugnpd2#

给予看:

relations: [{
        type: Backbone.HasOne,
        key: 'id',
        keyDestination: 'user_id',
        includeInJSON: 'user_id',
        autoFetch: true,
        relatedModel: User
    }]

我无法理解 Backbone.js 关系文档。显然,key应该引用相关模型的id,但在他们的任何示例中似乎都没有这样做。我想知道他们的示例是否真的有效?无论如何,我认为这解决了您的问题:将key设置为来自相关模型的键,并设置keyDestinationincludeInJSON,以便它知道如何设置结果并将结果序列化到产品对象中。

5t7ly7z5

5t7ly7z53#

因此,如果仔细查看 Backbone.js 关系文档,您会注意到它们给予的示例中没有一个是HasOne,而其reverseRelation为HasMany。因此,似乎功能未经测试(除了您!),并且无法正常工作。请尝试另一种关系:

var User = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    },

    relations: [{
        type: Backbone.HasMany,
        key: 'products',
        relatedModel: 'Product',
        reverseRelation: {
            key: 'id',
            keySource: 'user_id',
            keyDestination: 'user_id',
            includeInJSON: true
        }            
    }]            
});
// Product Model
var Product = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        is_buy_it_now: '',
        user_id: null
    }        
});

相关问题