ASP.NET MVC 4 を使用した Timeline.js と Knockout.js について質問があります。タイムライン +ノックアウト+デートピッカーの人々がそこにいます。
以下を含むビューがあり、div と ajax リンクを使用して、その div に部分ビューを設定します。
<div>Starting Order Date: <input data-bind="datepicker: StartDate, datepickerOptions: { maxDate : $.now() }" /></div>
<div id="Status"></div>
<a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#Status" href="/Track/Status/1">Blarg</a>
<script src="~/ViewModels/TrackModels.js"></script>
TrackModels.js には、datepicker 用のノックアウト エクステンダーがあります。簡潔にするために「更新」とdom破棄の部分を削除しましたが、本質的にはjquery-ui datepickerを使用したknockoutjs databindにあるものです
ko.bindingHandlers.datepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().datepickerOptions || {};
$(element).datepicker(options);
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
observable($(element).datepicker("getDate"));
});
}
};
そして、ajax リンクによって返され、ステータス div を置き換える部分的なビューは次のとおりです。
@model MyProject.Data.DTO.Timeline
<div id="timeline-embed"></div>
<script type="text/javascript">
var timeline_config = {
width: '100%',
height: '500',
source: {
"timeline":
@Html.Raw(@Json.Encode(Model))
}
}
</script>
<script type="text/javascript" src="~/scripts/js/storyjs-embed.js"></script>
さて、問題!ajax リンクをクリックする前に、datepicker が適切に機能してノックアウト モデルを更新します。ajax リンクをクリックすると、タイムラインが適切に表示され、本来あるべきものが表示されます。ただし、私の日付ピッカーはエラーで失敗し始めます:
TypeError: $(...).datepicker is not a function
observable($(element).datepicker("getDate"));
それで、どういうわけか、私が最初にバインドした要素は、それが日付ピッカーであることが失われています。できる....理由を教えてくれる人はいますか?部分的にstoryjs-embedを貼り付けることで何か問題がありますか? わかりません... Firebug でステップスルーすると、datepicker はまだ変更イベント ハンドラーをスローしていますが、何らかの理由で、要素が datepicker であることを失っているようです。助けてくれてありがとう!
編集:
残念ながら、Jeroen さん、それは完全ではありませんでした (提案された変更を試みましたが、それでも同じエラーが発生しました)。ただし、initセクションを次のように変更すると、
init: function(element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().datepickerOptions || {},
$el = $(element);
$el.datepicker(options);
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
observable($el.datepicker("getDate"));
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$el.datepicker("destroy");
});
},
そして、次の更新セクションを完全にコメントアウトします。
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element);
if (String(value).indexOf('/Date(') == 0) {
value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
}
var current = $el.datepicker("getDate");
if (value - current !== 0) {
$el.datepicker("setDate", value);
}
}
次に、Ajaxリンクを開いた後、私のdatepickerは同じエラーでエラーになりません。init セクションを元の状態 ($el なし) のままにすると、エラーが発生します。