从文档看来,数组只是 jQuery UI 正在寻找的东西的顺序。
该函数将日期作为参数,并且必须返回一个数组,其中 [0] 等于 true/false 指示此日期是否可选,[1] 等于 CSS 类名称或默认表示为 "" , 和 [2] 此日期的可选弹出工具提示。在显示之前,它会在日期选择器中的每一天被调用。
基本上该函数需要返回三个项目。
- 日期是否可以选择
- 您是否应该在当天添加课程
- 它的工具提示是什么
这是代码中的示例
// what the function should return
return [
(boolean) is the date selectable,
(string) the class to add to the day,
(string) the text to show when hovered over
]
更新: Stack Overflow(我认为所有 Stack Exchange 站点)使用以下内容显示“已访问”日历。我认为这种方法比我的要好得多,所以我正在更换它。
实际的“访问”日期像这样存储在 JSON 中。
{__YEAR__: {__MONTH__: {__DAY__:1}}}
这是一个例子。
var visited = {2012: {1: {1:1, 3:1, 4:1, 5:1, 18:1,19:1}, {3: {4:1, 5:1}}}
然后在里面beforeShowDay
他们确保visited
对象的键存在。这是我的他们的代码版本。
beforeShowDay: function(date) {
var y = date.getFullYear(),
m = date.getMonth() + 1,
d = date.getDay(),
hasVisited = visited[y] && visited[y][m] && visited[y][m][d];
return [false, (hasVisited ? 'has-visited-class' : ''), 'date'];
}
生成填充此所需的 JSON 非常特定于您的表结构。如果您在创建 JSON 方面需要帮助,我将需要更多工作。
更新 2
问题是 JavaScript 不能在对象中调用函数,这是无效的语法。另一件事是,我担心循环遍历数组中的所有项目会非常低效。
您的代码的正确语法如下所示。但正如我所提到的,由于效率低下,我不建议这样做。
注意:在行中beforeShowDay: function(__PARAM__)
。__PARAM__由jQuery 自动传递。这意味着您需要确保它是您正在寻找的值,而不是询问 jQuery 是否是 jQuery 正在寻找的值。
另一件事是数组从0
. 事实上,所有的编程语言都是从零开始的。因此,要获得所需索引处的值,您可以这样做。
var events = ['created a new product', '30-8-2012'];
console.log(events[0]); // "created a new product"
console.log(events[1]); // "30-8-2012"
这是您的代码的更正语法,但它不起作用,因为您无法从.each()
下面的函数返回。我只是提供这个,以便您可以看到我将如何更正您所写的内容。
$("#datepicker").datepicker({
beforeShowDay: function(date) {
jQuery.each(events, function(index, event) {
var active_class = "no-activity";
// make sure the event's date matches jQuery's date
if( event[1] == date ) {
active_class = "had-activity";
}
return [true, active_class, event[0]];
}
}
});
变化
在您的控制器内部,您需要以一种非常具体的方式提取事件。我建议使用Ruby Hash。AHash
是一个键值对。这意味着您可以将 设置key
为您的日期,并将 设置value
为您的标题。这将允许您轻松匹配 jQuery 提供的日期和事件列表中的日期。
这是您需要添加到控制器的内容。我使用了一个名为的函数strftime()
来格式化日期。基本上我把它改成了“日-月-年”,这样更容易和jQuery匹配。
1.
%e
返回没有零填充的月份中的日期。所以1
不是01
。
2.
%-m
返回没有零填充的月份。
3.
%Y
返回一个四位数的年份。
@events = {} # create an empty hash
# get all the events and add them to `@events`
CalendarEvent.select('date, title').all.map do |event|
@events[event.date.strftime('%e-%-m-%Y')] = event.title
end
然后在你的 JavaScript 中你可以得到@events
with。
<% javascript_tag do %>
$(document).ready(function() {
var events = <%= @events.to_json %>;
$("#datepicker").datepicker({
beforeShowDay: function(date) {
var y = date.getFullYear(),
m = date.getMonth() + 1,
d = date.getDate(), // gets the day of the month
formatted_date = d + '-' + m + '-' + y;
hasVisited = events[formatted_date];
return [true, (hasVisited ? 'has-visited-class' : ''), hasVisited];
}
});
});
<% end %>