草庐IT

javascript - EmberJS/Ember-data : hasMany collection incomplete, 尽管所有 ID 都存在

coder 2024-07-26 原文

安装版本

ember-cli   2.14.2
ember-data  2.14.10

一点透视:

我有一个名为 menu 的服务在计算属性中执行存储查询。这些商店查询之一的行为相当奇怪。它获取模型名称下的所有记录 product-segment来自功能齐全的 JSON API。该模型与名为 product 的模型具有 n-n 关系。 , 通过 hasMany 引用DS 对象:

模型/产品-segment.js
export default DS.Model.extend({

    products: DS.hasMany('product'),
    // ...
});

模型/product.js
export default DS.Model.extend({

    productSegments: DS.hasMany('product-segment'),
    // ...
})

问题:

现在,当我获取这些 product-segment模型,我将 API 指示为 { include: 'products' } ,并且 API 会按要求执行。响应包括 15 个相关的 product特定型号 product-segment , 哪个是对的。

(我们称它为 product-segment 段 x ,这是我下面所有调试信息的主题)

但是,访问 上的关系集合段 x 在任何情况下,任何时候都只返回 12 个模型,因此缺少 3 个。我目睹了与其他 product-segment 类似的问题模型,所以我不认为这是一个特定模型的问题。

更多视 Angular

我最初以为我正在处理某种竞争条件,并确保我创建了一个计算属性 - test - 找出来,我甩了{{menu.test}}进入我的视野,让计算出来的 Prop 发痒。

这是 services/menu.js 中的最低限度信息

export default Service.extend({

    store: inject(),

    activeProductSegment: null,

    // As a note: this does not trigger an infinite loop
    productSegments: computed('store.product.[]', 'store.product-segment.[]', function() {
        return get(this, 'store').findAll('product-segment', { include: 'products' });
    }),

    test: computed('activeProductSegment', function() {
        let segment = get(this, 'activeProductSegment');

        if (segment) {
            console.log(segment.hasMany('products').ids());
            console.log(get(segment, 'products').mapBy('id'));
        }
    }),
});

楼盘activeProductSegment正在设置为不同的 product-segment通过组件的操作对实例进行建模,如下所示:
export default Component.extend({
    menu: inject(), // menu service is injected here...

    actions: {
        setProductSegment(segment) {
            get(this, 'menu').set('activeProductSegment', segment);
        }
    }
});

该操作本身按预期工作,实际上与我的问题无关。 activeProductSegment永远不会以任何其他方式更新。 View 通过此操作 product-segment模型对象:
{{#each menu.productSegments as |segment|}}
    <li {{action 'setProductSegment' segment}}>{{segment.name}}</li>
{{/each}}

麻烦从这里开始

我设置menu.activeProductSegment段 x 通过单击其关联的<li>元素。

当我现在尝试获取所有相关 product 的型号段 x ,返回的集合中只有 15 个模型中的 12 个。为了确保 JSON 响应真的很好(即类型定义等是正确的),我检查了 product 的数量。在 注册的 ID段 x .我记录了以下行(以下日志的上下文在上面的 Ember.Service 片段中):
console.log(segment.hasMany('products').ids());

这返回了一个包含 15 个正确 ID 的数组,所以 段 x 拥有所有应有的身份。全部 product这些 id 的模型已包含在响应中,所以我认为某种异步数据应该没有问题。尽管如此,以下行还是给了我一个 12 个 id 的数组:
console.log(get(segment, 'products').mapBy('id'));

我尝试将 2 个日志放入 2 秒 setTimeout ,但结果保持不变:



我开始认为这是一个错误,因为我注意到第一次没有伴随模型的 id 是下一个 ID 第一次低于前面的 ID。

更新上述我在响应中尝试了不同的顺序,并注意第二个和第三个 id 的:"7", "6" .猜猜这不是问题:



除非我误解,模型应该是实时的,所以任何关系都应该随着数据的可用而更新。我认为这不太可能与格式错误的数据有关。
hasMany 中缺少模型的原因可能是什么?关系集合,尽管所有必要的 id 都已在 hasMany 正确注册关系对象,此时我们不需要等待任何异步/网络数据的到达?什么可能是该问题的合适解决方案?

最佳答案

我知道它似乎与异步问题无关,但我仍然会尝试将 hasMany 定义为非异步:

products: DS.hasMany('product', {async: true}),

关于javascript - EmberJS/Ember-data : hasMany collection incomplete, 尽管所有 ID 都存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45869475/

有关javascript - EmberJS/Ember-data : hasMany collection incomplete, 尽管所有 ID 都存在的更多相关文章

  1. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  2. ruby-on-rails - rspec - 如何检查方法是否存在? - 2

    我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu

  3. ruby-on-rails - ActiveRecord 的 find_or_create* 方法是否存在根本性缺陷? - 2

    有几种方法:first_or_create_by、find_or_create_by等,它们的工作原理是:与数据库对话以尝试找到我们想要的东西如果我们找不到,就自己做保存到数据库显然,并发调用这些方法可能会使两个线程都找不到它们想要的东西,并且在第3步中一个线程会意外失败。似乎更好的解决方案是,创建或查找即:提前在您的数据库中创建合理的唯一性约束。如果你想保存一些东西,就保存它如果有效,那就太好了。如果它因为RecordNotUnique异常而无法工作,它已经存在,太好了,加载它那么在什么情况下我想使用Rails内置的东西而不是我自己的(看起来更可靠)create_or_find?

  4. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  5. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  6. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  7. ruby-on-rails - 如果存在则更新,否则什么也不做? - 2

    当且仅当模型存在时,我才尝试更新模型的值。如果没有,我什么都不做。搜索似乎只返回更新或创建问题/答案,但我不想创建。我知道我可以用一个简单的方法来做到这一点:found=Model.find_by_id(id)iffoundupdatestuffend但是,我觉得有一种方法可以在一次调用中完成此操作,而无需分配任何临时本地值或执行if。如果记录不存在,我该如何编写一个Rails调用来更新记录而不出现嘈杂错误?最新的Rails3.x 最佳答案 您可以使用try在对find_by_id或where的结果调用update_attribut

  8. ruby - 如何使用 Ruby 检查域是否存在? - 2

    类似的东西:defdomain_exists?(domain)#performcheck#returntrue|falseendputs"valid!"ifdomain_exists?("example.com") 最佳答案 require'socket'defdomain_exists?(domain)beginSocket.gethostbyname(domain)rescueSocketErrorreturnfalseendtrueend 关于ruby-如何使用Ruby检查域是否存

  9. ruby-on-rails - 检查 Rails/Ruby 中对象是否存在的正确方法是什么? - 2

    我有很多模型和关系。由于这个事实,在View/Controller中有很多调用,看起来像这样:@object.something.with_something.value链的某些部分最终可能为零,这完全没问题。检查终端对象是否存在的正确/干净/快速的方法是什么?正在调用类似的东西:@object.something.with_something.valueifdefined?@object.something.with_something.value还可以吗? 最佳答案 在本地,您需要使用&&运算符(不是defined?),但这很快

  10. ruby - capybara 无法通过 id 找到元素 - 2

    capybara找不到在我的cucumber测试中用它的id标记。当我save_and_open_page时,我能够看到该元素.但我无法通过has_css?找到它或find:pry(#)>page.html.scan(/notice_sent/).count=>1pry(#)>page.html.scan(/id=\"notice_sent\"/).count=>1pry(#)>page.find('#notice_sent')Capybara::ElementNotFound:Unabletofindcss"#notice_sent"from/Users/me/.gem/ruby/2

随机推荐