警告:这是一本长篇小说,因为有很多与该问题有关的信息,所以请做好准备,并感谢您抽出宝贵的时间来解决此问题!
我正在为一个客户端编写一个非常大的WebApp,并为此使用jQuery构建了许多交互式应用程序,但是我开发的一个应用程序使我感到奇怪:是否有一种标准的方法可以执行此操作,或者更好的方法吗?
这是我来到你们这里的目的,以了解是否应该采取某种特定的方法,因为我一直在寻求构建最佳的应用程序。
我必须完成的任务
我正在构建的应用要求用户能够构建产品的发票。该发票可以通过搜索框添加任何数量的产品。每个产品都从数据库中提取并存储在该搜索框中,每个产品可以多次添加。
用户添加产品的方式是在搜索框中输入产品名称,然后按添加产品按钮。这会将处理后的模板添加到产品列表中。很简单吧?
问题
我遇到的一个大问题是,发票不仅可以包含产品列表,而且每个产品都包含不同的可定制详细信息。这意味着每个产品上都有许多自己的字段,用户可以编辑这些字段,从而修改了许多内容。例如,一种类型的产品具有数量,该数量需要乘以该产品的成本价格才能返回总价格。另一个产品的长度,需要乘以宽度,然后再乘以该产品的成本价格即可返回总价。
您可以想象,有许多不同类型的产品和许多不同的字段和有很多不同的计算方式,在创建结束时,需要解析为一个PHP页面,同时保持完全可修改性,用户可以在同一发票页面上添加/删除/编辑产品,而无需四处浏览。
对我来说,这是一场噩梦,因为我需要一种方法来保持这种状态整洁,并使一堆不同的输入/ jQuery对象不会以一种或另一种方式相互冲突。我还必须与新创建的产品区别加载,因为有些产品会从数据库中获取信息
我构建的解决方案
因此,当产品位于列表的前面时,该产品包含多个字段,多个详细信息和一个删除按钮。我要做的第一件事是为每种不同类型的产品制作带有可替换标记的模板。这很容易,而且工作得非常好,当一个产品排在该列表的前面时,会向与该产品相关的每个元素添加一个 rel 属性(我称之为“hook”),以便可以添加仅修改具有该特定挂钩的元素的处理程序。
对于输入,我使用了<input name="Products[%HOOK%][%PRODUCTDATAKEY%]" value="%PRODUCTDATAVALUE%" />形式的输入数组。出现我的主要问题的地方是,我必须将已经保存在数据库中的已加载产品与刚刚添加的新产品区分开。我这样做的方法是在所有输入名称数组之前添加[Loaded],这样我的PHP脚本将能够单独处理[Loaded]数组。
我担心什么?
我最大的担心是,从标记到代码,一切最终看起来如何困惑。 将钩到各处,极长的输入名称,几千行代码,以及需要替换的不同密钥和 token 的头疼,。它工作得非常好,当我将其视为开发人员时,感觉非常糟糕。以这个“添加的产品” 为例:<div class="item product special-order" rel="7" style="">
<input type="hidden" name="products[7][id]" value="17">
<input type="hidden" name="products[7][item_id]" value="">
<input type="hidden" name="products[7][type]" value="Special Order Flooring">
<input type="hidden" name="retail_price" class="invoice-base-cost" value="18.49">
<h4>Carpet Brand<a name="action" rel="7" class="btn btn-mini btn-danger remove-product initialized" style=""><i class="icon-remove"></i> Remove</a>
</h4>
<div class="item-details">
<div class="detail-column">
<div class="detail">
<span class="detail-label detail-label-medium"> Type:</span>Carpet
</div>
<div class="detail">
<span class="detail-label detail-label-medium">Range:</span> Carpet Brand
</div>
<div class="detail">
<span class="detail-label detail-label-medium">
Colour:</span><input required="" class="detail-input-large left-align" value="" type="text" name="products[7][colour]">
</div>
<div class="detail">
<span class="detail-label detail-label-medium">
Length:</span><input type="text" name="products[7][length]" rel="7" class="length-field initialized" placeholder="Enter the length..." value="1.000"><span class="detail-unit">m</span>
</div>
</div>
<div class="detail-column">
<div class="detail">
<span class="detail-label detail-label-large">Manufacturer:</span>
<select class="detail-input-large" required="" name="products[7][manufacturer_id]">
<option value="14">Manufacturer 1</option>
<option value="16">Manufacturer 2</option>
</select>
</div>
<div class="detail">
<span class="detail-label detail-label-large">Width supplied:</span><input type="text" name="products[7][width]" class="width-field" value="5.000"><span class="detail-unit">m</span>
</div>
<div class="detail">
<span class="detail-label detail-label-large">Retail price per/m:</span> £18.49
</div>
<div class="detail">
<span class="detail-label detail-label-large">Room:</span><input class="detail-input-large left-align" type="text" name="products[7][room]" value="" required="required">
</div>
</div>
<div class="item-cost">
<h5>Item cost</h5>
£<span class="invoice-cost" rel="7">92.45</span>
</div>
</div>
</div>
那不是过度杀了吗?难道我没有将它们映射到JSON对象以使其更干净吗?还是这是正确的方法?
该产品也有大约 5个不同的事件也绑定(bind)了,这很困惑,因为如果更改长度字段,,则必须通过宽度和基础价格重新计算价格,与宽度只是向后,而这都是由查找具有相同rel(钩)的字段完成的...对我来说,这看起来像是一团糟。最好就如何处理这一问题获得专家意见。
最佳答案
我对前两个答案表示赞同:使用旨在处理此问题的框架。
但是,在进行此操作之前,这是朝着模块化代码迈出的第一步:根据您的描述,您似乎已经有了.special-order项列表,并且每个项都有其自己的生命。
尝试在您的标记和代码中体现这一点:
1-标记:使用有意义的类名称来标识将扮演积极角色的项目(您似乎已经拥有:.special-order,.length-field,.remove-button ...)。确保有一个单个节点来包装整个html“bundle”(在您的情况下:.special-order似乎扮演了这个角色)。
2-事件挂钩:使用这些类名称来绑定(bind)您的挂钩:
$('.remove-button').click(function(){ ... });
$('.length-field').change(function(){ ... });
$('.special-order-list').on('click', '.remove-button', function(){ ... });
$('.special-order-list').on('change', '.length-field', function(){ ... });
.special-order节点的子节点,则它们是相关的。这样,您可以表示节点之间的关系,该关系不依赖于“rel”字段的显式值: $('.special-order-list').on('change', '.length-field', function(){
var $masterNode = $(this).closest('.special-order');
var basePrice = $masterNode.find('.base-price').val();
var length = $(this).val();
$masterNode.find('.total-price').val( basePrice * length );
});
function recomputePrice($masterNode){
var basePrice = $masterNode.find('.base-price').val();
var length = $masterNode.find('.length-field').val();
$masterNode.find('.total-price').val( basePrice * length );
});
$('.special-order-list').on('change', '.length-field, .base-price', function(){
var $masterNode = $(this).closest('.special-order');
recomputePrice( $masterNode );
});
关于php - 用JS/jQuery编写此代码的最佳方法是什么? (具有多个字段的多个单个对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18401456/
类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的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何