所以我正在设置一个具有更新属性的模型。
然后在我看来,我正在监听此模型的更改事件。
当它触发时我想我应该使用 model.changedAttributes?我是否将回调传递给它?
它应该返回所有更新的或新的属性的散列?无论如何要知道哪些是更新的,哪些是新的?
一旦我有了更改属性的散列值,我应该如何进行更新?将对象解析为属性类型,还是我应该从一开始就使用更高分辨率的监听器?
谢谢!
最佳答案
如果您的 View 仅显示单个属性 - 例如,如果它是一个显示模型的某些 bool 属性的复选框 - 您应该监听该属性的 'change:attribute_name' 事件,如 the Backbone docs 中所述.
如果您的 View 更复杂并且依赖于多个模型属性 - 例如,如果它是具有“完成”、“文本”和“到期日期”元素的“待办事项”列表项的 View ,则监听 '改变'事件。在这种情况下,您可以选择更新每个事件的所有元素,也可以使用 changedAttributes() 来确定哪些元素需要更新。
为了说明...
此样式适用于呈现的模型属性数量小于 3 左右的简单 View 。不仅如此,代码会变得有点麻烦。
model.bind('change:done', function() {
view.doneElement.checked = model.get('done');
});
model.bind('change:text', function() {
view.textElement.value = model.get('text');
});
model.bind('change:dueDate', function() {
view.dueDateElement.value = model.get('dueDate');
});
这种样式适用于呈现 4 个或更多属性的复杂 View (3/4 属性计数只是一个粗略的准则,主要基于我个人的意见)。
model.bind('change', function() {
view.doneElement.checked = model.get('done');
view.textElement.value = model.get('text');
view.dueDateElement.value = model.get('dueDate');
});
缺点是对于任何更改, View 的每个元素都会更新。因此,例如,如果有人将待办事项标记为“已完成”,文本将被重新呈现,可能会丢失他们在那里可能拥有的任何选择。有时这类事情是个问题,有时不是 - 您必须根据您的 View 到底在做什么来决定。
这是上述方法的更细微变化,结合了两种方法的优点。它根据 changedAttributes() 结果更新需要更新的 View 元素。
model.bind('change', function() {
var diff = model.changedAttributes();
for (var att in diff) {
switch(att) {
case 'done':
view.doneElement.checked = model.get('done');
break;
case 'text':
view.textElement.value = model.get('text');
break;
case 'dueDate':
view.dueDateElement.value = model.get('dueDate');
break;
}
}
});
最后,我会注意到还有另一种变体,它涉及让 View 存储它所显示的值的散列,并将其传递给 changedAttributes() 方法。这通常是不必要的,所以我不会在这里向您介绍详细信息。
关于javascript - 使用 backbone.js 更新更改的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444060/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t