こんにちは、みんな、
Knockoutjs を Jquery UI ウィジェットと組み合わせて使用し、選択した項目ごとに複数のスパンを持つオートコンプリート ボックスを表示しています。
私は以下のアプローチに従っています
1) ビューモデルには、監視可能な配列 (selecteditems) があり、それを宣言型テンプレートにバインドして SPAN を表示します。
2) 提案を表示する JQUERY UI オートコンプリート ウィジェットにバインドされた入力ボックス。選択ごとに、CustomBindingHandler を使用して、selecteditems 配列に新しい項目を追加します。
3) CustomBindingHandler を使用して、オブザーバブル配列の選択項目にバインドされている各 SPAN に JQUERY UI ToolTip ウィジェットを表示します。
問題-私が直面しているのは、JQUERY UI ToolTip ウィジェットがロード時に問題なく表示されることですが、selecteditems 配列に変更があるたびに、Tooltip ウィジェットが CustomBindingHandler で認識されません。
どんな助けでも大歓迎です。
<div>
<div style="max-height: 105px;" data-bind="foreach: selectedItems">
<span data-bind="text: name, id: id, assignToolTip: id"></span>
<input data-bind="assignAutoComplete: { rootVm: $root }" type="email" value="">
</div>
</div>
<script>
var MyViewModel = function () {
this.selectedItems = ko.observableArray(
[{ name: "eww", id: "ww" },
{ name: "aa", id: "vv" },
{ name: "xx", id: "zz" }]);
};
ko.bindingHandlers.assignToolTip = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if ($(element) != undefined) {
var currentDataItem = ko.dataFor(element);
$(element).tooltip({
items: 'span',
track: true,
content: function () {
return "<ul><li>" + currentDataItem.name + "</li><li>" + currentDataItem.id + "</li></ul>";
}
});
}
},
};
ko.bindingHandlers.assignAutoComplete = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if ($(element) != undefined) {
var currentDataItem = ko.dataFor(element);
$(element).autocomplete({
source: function (request, response) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
dataType: "jsonp",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
name_startsWith: request.term
},
success: function (data) {
response($.map(data.geonames, function (item) {
return {
label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
value: item.name
};
}));
}
});
},
minLength: 2,
select: function (event, ui) {
var settings = valueAccessor();
var rootVm = settings.rootVm;
rootVm.selectedItems.push({ name: ui.item.label, id: ui.item.label });
return false;
},
open: function () {
$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
},
close: function () {
$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
}
});
}
}
};
ko.applyBindings(new MyViewModel());
</script>
<script src="~/Scripts/jquery-ui-1.10.3.js"></script>