将项目添加到 ember-data 的过滤结果中

2023-11-25

我有一个DS.Store它使用DS.RESTAdapter and a ChatMessage对象定义如下:

App.ChatMessage = DS.Model.extend({
    contents: DS.attr('string'),
    roomId:   DS.attr('string')
});

请注意,聊天消息存在于房间中(为简单起见,未显示),因此在我的聊天消息控制器中(它扩展了Ember.ArrayController)我只想加载用户当前所在房间的消息:

loadMessages: function(){ 
    var room_id = App.getPath("current_room.id");
    this.set("content", App.store.find(App.ChatMessage, {room_id: room_id}); 
}

这设置了content to a DS.AdapterPopulatedModelArray我的视图很高兴地显示所有返回的聊天消息{{#each}} block.

现在要添加新消息,我在同一个控制器中有以下内容:

postMessage: function(contents) {
    var room_id = App.getPath("current_room.id");
    App.store.createRecord(App.ChatMessage, {
        contents: contents,
        room_id: room_id
    });

    App.store.commit();
}

这将启动一个 ajax 请求以将消息保存在服务器上,到目前为止一切都很好,但它不会更新视图。这非常有意义,因为它是一个过滤结果,如果我删除了 room_id 过滤器App.store.find然后它会按预期更新。

Trying this.pushObject(message)与返回的消息记录App.store.createRecord引发错误。

如何手动将项目添加到结果中?据我所知,似乎没有办法DS.AdapterPopulatedModelArray and DS.FilteredModelArray是不可变的。


所以有几个想法:

(参考:https://github.com/emberjs/data/issues/190)

如何监听数据存储中的新记录

普通的 Model.find()/findQuery() 会返回一个 AdapterPopulatedModelArray,但该数组将独立存在......它不会知道任何新内容已加载到数据库中

没有参数的 Model.find() (或 store.findAll())将返回 FilteredModelArray 的所有记录,而 ember-data 会将其“注册”到列表中,加载到数据库中的任何新记录都将添加到这个数组。

调用 Model.filter(func) 将为您返回一个 FilteredModelArray,它也已在商店中注册...并且商店中的任何新记录都会导致 ember-data 为“updateModelArrays”,这意味着它将使用以下命令调用您的过滤器函数新记录,如果你回来true,然后它会将其粘贴到您现有的数组中。

所以我最终做了什么:创建商店后,我立即调用 store.findAll(),它返回一个类型的所有模型的数组......然后我将其附加到商店......然后其他任何地方在代码中,我可以将ArrayObservers添加到这些列表中..类似于:

App.MyModel = DS.Model.extend()
App.store = DS.Store.create()
App.store.allMyModels = App.store.findAll(App.MyModel)

//some other place in the app... a list controller perhaps
App.store.allMyModels.addArrayObserver({
   arrayWillChange: function(arr, start, removeCount, addCount) {}
   arrayDidChange: function(arr, start, removeCount, addCount) {}
})

如何将模型推入这些“不可变”数组之一:

首先要注意的是:所有 Ember-Data 模型实例(记录)都有一个 clientId 属性...这是一个唯一的整数,用于标识数据存储缓存中的模型,无论它是否具有realserver-id 尚未(例如:在执行 Model.createRecord 之后)。

因此 AdapterPopulatedModelArray 本身有一个“content”属性...它是这些 clientId 的数组...当您迭代 AdapterPopulatedModelArray 时,迭代器会遍历这些 clientId 并返回映射的完整模型实例(记录)到每个 clientId。

那么我做了什么(这并不意味着它是“正确的”!)是观察那些 findAll 数组,并将新的 clientId 推送到 AdapterPopulatedModelArray 的 content 属性中...类似:

arrayDidChange:function(arr, start, removeCount, addCount){
    if (addCount == 0) {return;} //only care about adds right now... not removes...
        arr.slice(start, start+addCount).forEach(function(item) {
            //push clientId of this item into AdapterPopulatedModelArray content list
            self.getPath('list.content').pushObject(item.get('clientId'));
        });
    }

我能说的是:“它对我有用”:)它会在下一次 ember-data 更新时中断吗?完全有可能

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

将项目添加到 ember-data 的过滤结果中 的相关文章

随机推荐

  • 我应该如何理解&**self in Box

    boxed rs 中的代码 stable feature rust1 since 1 0 0 rustc const unstable feature const box issue 92521 impl
  • 全新的rails应用程序,无法生成脚手架

    虽然我不是专家 但我已经在内部开发了一些 Rails 应用程序 用于一些相对小型 中型的项目 并且之前没有遇到过与此类似的问题 我只是想创建一个新的应用程序 然后创建一个脚手架 但我收到了有关 sqlite3 gem 的错误 看看这个 我的
  • ExpandableListView 显示没有子项的组的指示器

    我正在创建一个ExpandableListView与数据库中的数据 为此 我正在使用CursorTreeAdapter我用一个填充它Cursor包含我从数据库检索的数据的对象 我认为 默认情况下Android会考虑没有孩子的组 不可扩展 但
  • 为什么从 v6 升级到 IdentityModel v7 后出现 IDX20803 错误?

    升级后Microsoft IdentityModel Tokens and System IdentityModel Tokens Jwt to 7 0 0 我收到此错误 IDX20803 无法从 https example com rea
  • 修改本地存储?

    我正在使用 simplecartjs 为在线商店提供支持 它将数据存储在本地存储中 如下所示 SCI 1 quantity 1 id SCI 1 price 20 name Mattamusta teippi size Tyhj SCI 3
  • Android:如何将预览帧保存为jpeg图像?

    我想将预览帧保存为 jpeg 图像 我尝试编写以下代码 public void onPreviewFrame byte data Camera camera if settings isRecording Camera Parameters
  • 使用 TypeScript 和 React 输入 redux 表单 v7

    我有一个简单的由react redux驱动的表单 我希望有一个 form container tsx 和一个 form component tsx 其中 form container tsx 保存所有到 redux 状态的连接减去 Fiel
  • Xcode 界面生成器未检测到 Admob 框架类

    我一直在尝试在我的 iOS 应用程序中实现原生 Google adMob 广告 并遵循 admob 官方教程 https developers google com admob ios native advanced 无论我是手动添加所需的
  • c# 中的 blackmagic SDK

    我正在尝试在 windows7 64x 上使用最新的 SDK 2011 年 6 月 和 C VS 2010 Express 从一张 blackmagic 强度专业卡捕获 720p 我已经成功编译并运行了一个以 YUV 捕获帧的程序 但是 捕
  • 使用 Moq 模拟 nHibernate QueryOver

    测试时 以下行因空引用而失败 var awards session QueryOver Where x gt x BusinessId int business List 我的测试是这样的 var mockQueryOver new Moc
  • MongoDB 子文档嵌套文档验证

    我得到了一份结构如下的文档 我的问题是如何在数据库端进行嵌套部分 角色 验证 我的要求是 角色大小可以为 0 或大于 1 如果创建了角色 则存在角色的 name 和created by id 123456 name User Name ro
  • bootstrap-table-filter-control 扩展在 bootstrap-table 中不起作用

    I use 引导表并想使用表过滤器控制扩大 在this您可以通过示例了解如何使用此扩展 当我想将此扩展用于更多列时 它不起作用 在我的示例中 过滤器仅适用于一列 jsfiddle html table class table table s
  • 如何使用GDI+绘制ARGB位图?

    我有有效的HBITMAP的句柄ARGB类型 如何使用它来绘制GDI 我尝试过方法 graphics DrawImage Bitmap FromHBITMAP m hBitmap NULL 0 0 但它不使用 Alpha 通道 我有工作样本
  • Angular js 缩小后出现错误。错误:[$injector:unpr] 未知提供者:eProvider <- e <- makeErrorsDirective

    我使用 Gulp 来缩小整个 js 文件 缩小后 我收到如下错误 injector unpr Unknown provider eProvider lt e lt makeErrorsDirective 我的控制器文件中有一个自定义指令 v
  • 从 Common Lisp 中的嵌套循环返回

    我正在尝试将此 Python 代码转换为 Common Lisp for a in xrange 1 1000 for b in xrange a 1000 c a 2 b 2 0 5 s a b c if s 1000 return a
  • 并行运行单元测试

    有谁知道是否有办法在 Visual Studio 中并行运行不同的 测试方法 NUnit 2 5有一个选项支持并行运行单元测试 这与 VS 内置的单元测试框架无关 但可以使用正确的插件在 VS 内运行 NUnit 测试
  • 如何在 MKAnnotations 上方显示 MKOverlay?

    我正在尝试使用MKOverlay 特别是MKPolyline 在地图上显示路线 但是 我需要路线显示在我现有的引脚上方 自定义MKAnnotationViews 有没有好的方法可以带MKPolyline到引脚上方的前面 研究注释层可能会很有
  • 禁用 NSOutputStream 的 Nagle 算法

    我正在使用创建多人游戏MPCF 您可以使用 iPhone 在 iPad 上控制宇宙飞船 我在随机时间和间隔内经历了各种程度的滞后和延迟以及缓冲 暂停 现在已登陆苹果技术问答 NW26讨论禁用 Nagle 算法的论文 我正在尝试 但我的程序不
  • 如何在 jQuery 中动态添加锚点/href

    我是 jQuery 新手 我正在尝试将所有手机类转换为带有 h ref 的锚点 我拥有的 div class phone 111 111 1111 div div class phone 666 555 4444 div 我想要的是 div
  • 将项目添加到 ember-data 的过滤结果中

    我有一个DS Store它使用DS RESTAdapter and a ChatMessage对象定义如下 App ChatMessage DS Model extend contents DS attr string roomId DS