Helper函数——希望dry
Helper functions - hoping for DRYness
我喜欢使用辅助函数的想法,但是我在设计上有点挣扎。
我有一个Javascript函数,可以添加一个实体到列表框-看起来或多或少像这样:
function MyEntityAdd(o) {
var li = $('<li />').append(o.Product.Name);
$('#SomeListbox').append(li);
}
…它以两种方式被调用:1)在页面加载时显示项:
$(function() {
@foreach (var item in Model) {
@: MyEntityAdd({ Product: { Name: '@item.Product.Name' }});
}
}
和,2)当用户(通过ajax调用)创建新实体时向现有页面添加项:
$.ajax({ type: 'post',
url: '/MyEntity/Create',
data: { ... },
success: function(o) {
MyEntityAdd(o)
}
});
现在我的问题是:我需要格式化产品,我通过一个辅助函数来完成它:
@helper FormatProduct(MyEntity e)
{
<strong>@e.Product.Name</strong> @e.Version
}
所以现在我可以像这样重新定义我的Js(参数现在是平面的,而不是一个嵌入对象的对象):
function MyEntityAdd(o) {
var li = $('<li />').append(o.Product);
$('#SomeListbox').append(li);
}
这样调用:
$(function() {
@foreach (var item in Model) {
@: MyEntityAdd({ Product: '@Html.FormatProduct(item.Product)' });
}
}
…所有的好。除了现在success
ajax调用不工作,因为Create
动作返回JSON对象…所以我必须在控制器内格式化产品即,不是返回:
[HttpPost]
public ActionResult Create(string Name)
{
MyEntity e = new MyEntity(Name);
db.MyEntities.Add(e);
db.SaveChanges();
return Json(e);
}
我必须在这端复制格式化功能:
[HttpPost]
public ActionResult Create(string Name)
{
MyEntity e = new MyEntity(Name);
db.MyEntities.Add(e);
db.SaveChanges();
return Json(new { Product = MyServerSideFormattingFunction(e) });
}
,这是eeky(不是DRY)。灵感吗?
你的质疑是对的。就我个人而言,我喜欢DRY,但我看到的最后一个想法中最糟糕的事情是,你将在你的控制器中添加HTML,这从根本上说是不好的做法,因为这是你的视图的工作。
我认为辅助函数是伟大的,但他们只是服务器端,他们不是正确的工具,为您的客户端使用。
所以我会重写你的MyEntityAdd函数为:
function MyEntityAdd(o) {
var productDisplay = '<strong>' + o.Product.Name + '</strong> ' + o.Version;
var li = $('<li />').append(productDisplay);
$('#SomeListbox').append(li);
}
一切都应该像使用helper方法之前一样到位,当然它是DRY。有时候最简单的方法就是最好的。
相关文章:
- Amd,希望确保某个东西总是最后执行
- 我想使用模态通过php文件发送邮件,并且我希望在提交关闭后关闭pop
- 我希望只有在我滚动页面后才能显示我的返回页首图标
- 我希望在不替换现有变量的情况下恢复localStorage中的变量
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 页面在我的javascript执行后重新加载,我不希望它这样做
- 用DRY方式Javascript/JQuery动态替换HTML
- 重构DRY代码的Node.JS回调
- 自定义调查页面并希望在时区内按时间忽略(可能)
- 在javascript中使用split函数希望在页面加载时拆分url
- Jquery幻灯片以一行左侧的图像开始,但我希望它从右端开始
- PHP REST服务抛出异常——希望避免控制台错误
- 我希望这个日期选择器可以从1990年到2000年之间的年份中选择日期
- 我有多个复选框,并希望为其中 2 个制定规则,以便如果我选择 1 个,则无法选择另一个
- VS2010 javascript调试器希望在VS2010的新实例中启动
- 如何隐藏滚动条,但希望它继续工作
- Noob web开发人员希望添加web设计和交互
- 正在创建网页,并希望将外部链接调用为html和css
- 如何在为表单输入分别处理$(this)和$时编写DRY代码
- Helper函数——希望dry