我已经尝试解决这个问题很长一段时间了。我找不到任何解决此问题的方法,但如果我错了,请纠正我。
问题: 我有来自 JSON API 的数据,具有嵌套数组/对象结构。我使用映射最初用我的数据填充模型。要更新它,我想在新数据到达时扩展模型,或者更新现有数据。
据我所知,映射选项键应该对我有用,但我可能误解了映射选项的功能。
我已经归结了这个例子要表示的问题:
var userMapping = {
key: function(item) {
return ko.utils.unwrapObservable(item.id);
}
};
// JSON call replaced with values
var viewModel = {
users: ko.mapping.fromJS([], userMapping)
};
// Should insert new - new ID?
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users);
// Should only update ID#1 - same ID?
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users);
// Should insert new - New ID?
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users);
ko.applyBindings(viewModel);
fiddle :http://jsfiddle.net/mikaelbr/gDjA7/
如您所见,第一行插入数据。都好。但是当我尝试更新时,它会替换内容。第三个映射相同;它替换内容,而不是扩展它。
我是不是用错了?我应该在使用映射之前尝试“手动”扩展内容吗?
编辑解决方案:
我通过使用第二个辅助数组存储所有当前模型来解决这个问题。在新数据上,我扩展了这个数组,并更新了 View 模型以包含累积的项目。
在更新时(在我的例子中是 WebSocket 消息),我遍历模型,更改相关项目的内容,并使用方法 valueHasMutated() 向 Knockout 库发出更改值的通知。
最佳答案
通过查看您的示例代码,映射插件的行为完全符合我的预期。当您在集合上调用 fromJS 时,您实际上是在告诉映射插件这是该集合的新内容。例如:
在第二行,它怎么知道你是在更新还是只是删除了 id:2?
虽然您可以添加一个,但我找不到将数据视为简单更新的合适方法的任何提及。映射数组带有一些有用的方法,例如 mappedIndexOf 可以帮助您找到特定的项目。如果您收到一个更新数据集,只需循环遍历它,找到该项目并使用对该特定项目的 mapping.fromJS 调用来更新它。这可以很容易地概括为可重用的方法。
关于javascript - knockout JS : Update/Insert data to a viewModel using mapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9636908/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
在Rails中,update_attributes!的逆运算是什么?换句话说,是什么将记录映射到属性散列以重新创建该记录及其所有子记录?答案不是ActiveRecord.attributes,因为它不会递归到子对象中。澄清您是否有以下情况:classFoo然后你可以像这样传递一个散列{"name"=>"afoo","bars_attributes"=>[{"name"=>"abar}...]}到update_attributes。但目前尚不清楚如何为此目的以编程方式轻松生成这样的哈希值。编辑:正如我在评论中提到的,我可以做类似的事情:foo.as_json(:include=>:bar
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=
这是一个棘手的问题。我有一个包含多种内容类型的项目,例如文章、评论等。每种内容类型都有评论,评论是多态的,因为它们可以属于任何内容类型。我想在我的所有内容页面上放置一个评论总数计数器以显示有多少评论,并且我实现了一个计数器缓存来执行此操作。(@article.comments.count之类的查询更多,并且由于我将Ancestrygem用于线程评论,因此子评论不计入该数字,仅计入根评论。)计数器缓存运行良好并显示评论的准确数量,但一如既往地有一个小问题。评论并不总是立即发布,只有注册用户才能立即发布,并且这些评论的:status为“2”。未注册用户进入审核队列;这些评论的:status
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click