ドキュメントから、配列は jQuery UI が探しているものの順序にすぎないように見えます。
この関数はパラメータとして日付を取り、この日付が選択可能かどうかを示す true/false に等しい [0]、CSS クラス名に等しい [1] またはデフォルト プレゼンテーションの "" の配列を返す必要があります。 、[2] この日付のオプションのポップアップ ツールチップ。表示される前に、日付ピッカーで毎日呼び出されます。
基本的に、この関数は 3 つの項目を返す必要があります。
- 日付が選択可能かどうか
- その日にクラスを追加する必要がありますか
- そのツールチップは何ですか
これがコードの例です
// 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
]
更新:スタック オーバーフロー (およびすべてのスタック 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 がオブジェクト内で関数を呼び出すことができないことです。これは無効な構文です。もう 1 つは、配列内のすべての項目をループ処理するのは非常に効率が悪いことです。
コードの正しい構文は次のようになります。しかし、前述したように、非効率であるため、これを行うことはお勧めしません。
注:行でbeforeShowDay: function(__PARAM__)
. __PARAM__は jQueryによって自動的に渡されます。つまり、jQuery が探している値かどうかを jQuery に尋ねるのではなく、探している値であることを確認する必要があります。
もう 1 つは、配列が から始まることです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
4 桁の年を返します。
@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 で with を取得できます@events
。
<% 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 %>