您可以预加载相关数据,以便将您的关系缓存在 ember-data 中吗?

2024-04-19

我有一个简单的 hasMany/belongsTo 关系,如下所示

App.Foo = DS.Model.extend({
  bar: belongsTo('bar', { async: true})
});
App.Bar = DS.Model.extend({
  foos: hasMany('foo', { async: true})
});

我的路由代码中存在触发请求的情况,当响应返回时,我在过滤/等时访问相关的“bar”模型

this.store.all('foo').clear();
var fooz = self.store.all('foo'); //new code
return this.store.find('foo').then(function(response) {
  var filtered = response.filter(function(foo) {
    return foo.get('bar').get('name') === 'bazz';
  });
  //other code that would normally be executed top-down
  //including side-effect stuff like this
  //self.store.createRecord('foo', someHash);
  return fooz; //new code
});

上面的内容第一次不起作用,因为 foo.get('bar') 是一个承诺。但这只是第一次出现的问题(后续的 $.ajax 请求似乎缓存了所有 bar 对象,因此这不是问题)

奇怪的是,在我启动应用程序之前,我已经拉下了 init 中的所有条形数据(如下所示)。那么,为什么 ember-data 甚至需要解决“bar”的承诺,而从技术上讲,数据应该已经在本地存储中呢?

App.initializer({
  name: 'bootstrap',
  initialize: function() {
    App.deferReadiness();
    var store = App.__container__.lookup("store:main");
    var bars = store.find('bar');
    var configurations = store.find('configuration');
    Ember.RSVP.all([bars, configurations]).then(results) {
      App.advanceReadiness();
    });
  }
});

让我们在这里分开一些事情

存储缓存

this.store.all('foo').clear();

只是破坏了内部all过滤直至foo记录被修改/添加/删除,迫使过滤器重新计算存储中的记录。我这样说是为了表明clear 并没有从 ED 的存储中删除记录。

示例(单击按钮,观看控制台,阅读有趣的操作代码)

http://emberjs.jsbin.com/OxIDiVU/103/edit http://emberjs.jsbin.com/OxIDiVU/103/edit

也就是说,被缓存的不是 ajax,而是被缓存的记录实例(和记录)上的属性/关系。

从存储中删除某种类型的记录的正确方法是store.unloadAll('foo')

普罗米塞兰迪亚

我知道您已经熟悉 Promise,所以这部分可能毫无价值,但是值得记录

异步关系真的很酷,因为它们会返回PromiseObject/PromiseArray for belongsTo/hasMany. The PromiseObject/PromiseArray extend ObjectProxy/ArrayProxy(这些是相同的事情ObjectController/ArrayController延长)。这本质上给出了PromiseObject/PromiseArray代理获取/设置下面模型的属性的能力。在这种情况下,在承诺上发生的设置/获取在承诺得到解决之前不会“工作”(它不会崩溃,只是返回未定义)。 *警告,承诺中不存在方法,因此您不能对承诺调用 save 并期望它起作用。

前任。使用你的模型。

var foo = this.store.find('foo', 1);

var bar = foo.get('bar');  // PromiseObject

bar.get('name'); // undefined

后来,bar已经解决了,bar仍然是PromiseObject

bar.get('name'); // billy

foo 将继续返回 PromiseObject

var bar2 = foo.get('bar');  // PromiseObject

bar2.get('name'); // billy

saving

bar.save(); // Boom no workey

bar.then(function(realBar){
  realBar.save(); // workey
});

对于你的情况我有3条建议

构建您自己的承诺,在需要时解决,对所需的记录使用 Ember.RSVP.all (考虑到它们可能尚未解决,因此是异步的)

var self = this;

var promise = new Ember.RSVP.Promise(function(resolve, reject){
  self.store.find('foo').then(function(foos) {
    Em.RSVP.all(foos.getEach('bar')).then(function(bars){

      var filtered = bars.filterBy('name', 'bazz');

      resolve(filtered);
    });
  });
});
return promise;

http://emberjs.jsbin.com/OxIDiVU/104/edit http://emberjs.jsbin.com/OxIDiVU/104/edit

异步属性

很多时候,对于在模型挂钩期间未解析的异步对象/属性(它会阻止 Promise 并等待它们被解析),一个好技巧是设置占位符对象等。

var items = [];

controller.set('model', items);

// promise from above
promise.then(function(records){
  items.pushObjects(records.toArray()); // toArray may or may not apply
});

http://emberjs.jsbin.com/OxIDiVU/106/edit http://emberjs.jsbin.com/OxIDiVU/106/edit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您可以预加载相关数据,以便将您的关系缓存在 ember-data 中吗? 的相关文章

  • ember js 子视图和 didinsertelement 事件

    我正在写一个Ember View 它将树结构变成菜单 我需要递归 所以我在视图模板中使用的是 view helper 它递归地调用自身来构建嵌套 ul li 结构 我需要的是一个钩子来调用一些 jQuery 插件来将此结构转换为菜单 当我从
  • EmberJS:如何为 ember-data RESTAdapter 中的模型提供特定的 URL?

    问题一 如果我有一个名为 Company 的余烬数据模型 我如何告诉它点击 businesses and businesses id而是检索记录 有没有办法指定给定模型的 url 更好的是 像 BackboneJS 一样 我可以在运行时计算
  • 在 #each 内渲染视图

    每当我尝试在 each 块内渲染视图时 我都会收到一条 PrecompilationError 消息 Compiler said Error each doesn t match view Example each posts view A
  • 使用 EmberData 在本地存储中缓存远程数据

    我有一个关于使用 Ember 加载和缓存远程对象的问题 我正在开发一个 Ember 应用程序 它通过 REST API 使用服务器端存储 一些获取的数据很少发生变化 因此每次应用程序加载时都从服务器获取数据是不必要的 但这对于需要离线工作并
  • 在哪里放置固定装置?

    我应该在使用 ember cli 生成的 Ember JS 应用程序中的哪里定义固定装置 我尝试过很多地方 例如app js并在一个名为 fixtures 的文件夹中 经过一番挖掘后我发现改变Ember MODEL FACTORY INJE
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • Emberjs 将多个控制器加载到一个控制器中

    SCENARIO我目前有一个IndexRoute 我想将另外 3 个控制器加载到其中 另外 3 个控制器称为Sports News Business 我阅读了 embersjs 文档 它指出您需要实现renderTemplate钩入Inde
  • 使用“ember-rails”将路由从 Rails 迁移到现有 Rails 应用程序的 Ember

    将 gem ember rails 用于现有的 Rails 应用程序 我正在尝试使用 Ember 路由一个资源 很多人告诉我这段代码应该可以工作 但事实并非如此 我想突破学习曲线并使这项工作成功 但我需要一些帮助 Error Routing
  • 同时使用 localStorage 和 REST 远程服务器的数据层架构

    任何人对于如何实现同时使用 localStorage 和 REST 远程存储的数据持久层都有任何想法或参考 某个客户端的数据存储在 localStorage 中 使用 ember data indexedDB 适配器 本地存储的数据与远程服
  • Rails 和 Ember 的 JSONAPI 强参数

    我将 Ember 与 ember data 和 Rails api 一起使用 我有一个 createRecord 和 save 来保存工作正常的记录 用于在 Rails 中创建记录的发布请求的网络选项卡中的有效负载如下所示 data att
  • 如何使用新路由器重新渲染应用程序模板?

    The code 我正在使用的版本4fcdbf2560 https github com emberjs ember js tree 4fcdbf256039e8ca8d2647050e0c9a71234c922c与新路由器 在我的应用程序
  • 使用 ActiveModel::Serializers 包含两个父 json 数组

    我正在尝试发送如下所示的前端应用程序 json facilities id 5 name happy days ranch location address 1424 Pastoral Lane zipcode 25245 instruct
  • EmberJS 支持单字母单词模型吗?

    我无法真正确定问题是 Ember 还是 Ember 数据 或者甚至是一个问题 但发生的情况如下 假设你的模型被称为tell me a story 如果您使用 ActiveModelAdapter 这将是您的 JSON 应该提供的名称 无论如
  • Ember 克隆模型创造新纪录

    我想克隆当前正在编辑的模型 我发现了几种几乎有效的方法 但两者都不完美 1 model get data attributes 获取除驼峰式形式的关系之外的所有属性 生成一条新记录 但关系当然丢失了 2 model serialize 生成
  • Ember.js - 渲染到插座中的默认模板?

    所以我有一个如下所示的页面 Nav Bar Content 我希望导航栏在所有页面上保持不变 所以我使用的方法是将我的页面设置如下 Nav Bar outlet 这太棒了 我现在可以将不同的页面渲染到不同路线的出口中 但是 如果我希望将默认
  • 围绕活动的 {{linkTo}} 创建一个
  • 最干净的获取方式是什么 li class active 对于以下 Ember 应用程序中的活动页面 索引 html app js App Ember Application create App Router map function th
  • 为车把/余烬定义模板内的数组?

    我在 ember 应用程序中有一个车把模板 它接受一个数组 我目前像这样声明数组 模板 Gd radio input content radioContent value blue JavaScript App IndexControlle
  • Ember 模板中的访问常量

    不确定正确的 Ember Way 是什么来做到这一点 我有以下模板 我想要三个task item list组件实例 每个实例都有不同的taskState价值 显然 我想摆脱神奇的数字 h4 Tasks h4 div h5 Backlog h
  • 当加载详细条目和条目列表时,Ember 数据会删除列表响应中未设置的字段

    我有一个Book模型 具有多个属性 例如title author and prices prices是一个历史定价信息的大列表 当我从 API 请求图书列表时 我排除了prices场以保持响应较小 在书籍详细信息视图中 我请求完整的书籍信息
  • ember-data:如何制作正在保存/已保存的闪存消息

    为了在我的应用程序顶部制作一个黄色的 正在保存 已保存 指示符消息 我希望有一个布尔属性来指示当前是否有任何余烬数据记录正在运行 我试过这个 App store DS Store create isSaving gt for record

随机推荐