【发布时间】:2014-01-01 14:03:24
【问题描述】:
我将 IEnumerable 发送到 javascript 客户端。我想知道将这些值发送给客户端的最佳格式是什么,这些值的消耗和计算最适合 angularJS 本身或 angularjs/moment.js 库?
以整数 0、1、2、3、4、5、6 或星期日/星期一/星期二等形式发送值...
【问题讨论】:
标签: javascript json angularjs momentjs
我将 IEnumerable 发送到 javascript 客户端。我想知道将这些值发送给客户端的最佳格式是什么,这些值的消耗和计算最适合 angularJS 本身或 angularjs/moment.js 库?
以整数 0、1、2、3、4、5、6 或星期日/星期一/星期二等形式发送值...
【问题讨论】:
标签: javascript json angularjs momentjs
我认为 dayOfTheWeek 值可以作为整数发送。因为,它仅在 JS 中以相同的方式处理,即作为整数..
JS
var d = new Date();
console.log("date is ->",d," and day of the week is->", d.getDay());
console.log("Now changing date");
d.setDate(4);
console.log("date is ->",d," and day of the week is->", d.getDay());
输出
date is -> Wed Jan 01 2014 19:46:07 GMT+0530 (India Standard Time) and day of the week is-> 3 VM331:3
Now changing date VM331:4
date is -> Sat Jan 04 2014 19:46:07 GMT+0530 (India Standard Time) and day of the week is-> 6
所以最好有一个整数,也可以降低网络流量。
【讨论】:
“最佳”是主观的,但我会给你我的意见。
从原始 JavaScript 的角度来看,星期几是 0(星期日)到 6(星期六)。你可以看到in the MDN docs。它与 C# 的 DayOfWeek 枚举完全一致,因此您当然可以通过它,但出于某些原因,我不推荐它。
一旦你有了它,你打算用 JavaScript 做什么? Date 对象有一个 getDay(),但它没有 setDay(),因此您不能将现有日期调整为一周中的特定日期,除非您要进行自己的计算或使用moment.js 之类的库。
Moment.js 有 a day function for that,所以你可以这样传递它:
moment().day(0);
但您也可以轻松传递全天名称:
moment().day("Sunday");
如果您需要用 7 表示星期日,您可以使用 another function
moment().isoWeekday(7);
这带来了一个有趣的点,即日期和时间的标准是 ISO-8601,并且该标准使用weekdays numbered 1 through 7。如果您要以数字形式从应用程序中发送数据,它不应该符合标准吗?我认为是这样,但话又说回来 - 谁说这些数据的消费者会理解该标准正在使用?只是一个简单的整数,真的很难分辨。
然后想一想 JSON 序列化。 JSON 格式被设计为比 XML 更紧凑,但仍然是人类可读的。其中哪一个看起来更易读?
{ days: [0,1,2] }
或
{ days: ["Sunday", "Monday", "Tuesday"] }
不相信?传递一个完整的日期和时间怎么样?
{ date: 1388453025678 }
或
{ date: "2013-12-31T01:23:45.678Z" }
显然,第二种选择在两种情况下都更易于阅读。
通常,将 C# 枚举序列化为字符串而不是整数是一种公认的做法,否则它们可能会失去其原始含义。在上面的示例中,如果我调用变量foo 而不是days 会怎样。使用数字形式,您将不知道数据代表什么。
因此,我的建议是传递字符串版本。优点很多,我能想到的缺点只有两个,分别是:
数字形式更紧凑 - 但这不是 JSON 的目标。如果您需要较小的数据,那么您最好使用像 Google 协议缓冲区这样的二进制序列化格式。但这通常是矫枉过正——除非你的应用程序的其他部分需要,否则我不会走这条路。
工作日名称为英文。就个人而言,我认为 JSON 本身并没有那么糟糕,但有些人可能更喜欢本地化。不过,您总是可以稍后再做:
moment().day("Sunday").lang('fr').format("dddd"); // "dimanche"
您还提到了 Angular.js,它确实有一个 date filter,但无论哪种方式,您都不能只绑定一周中的一天。所以这并不是决定的真正因素。
【讨论】: