我正在使用带有bootstrap-tokenfield和typeahead的淘汰赛来显示标签。以前我需要一种方法来以一种很好的方式显示我的标签,因此我创建了一个自定义绑定。当标签列表没有变化并且只有选定的标签发生变化时,它的效果非常好。
所以一个真正简化的例子看起来像这样。如您所见,您可以键入各种标签(tag1
, tag2
, ..., tag5
),并且 observable 正在发生变化。所以我的自定义绑定在这种情况下有效。
这里是:
ko.bindingHandlers.tags = {
init: function(element, valueAccessor, allBindings) {
var initializeTags = function(listOfTags, inputID, max){
var tags = new Bloodhound({
local: listOfTags,
datumTokenizer: function(d) {return Bloodhound.tokenizers.whitespace(d.value);},
queryTokenizer: Bloodhound.tokenizers.whitespace
});
tags.initialize();
inputID.tokenfield({
limit : max,
typeahead: {source: tags.ttAdapter()}
}).on('tokenfield:preparetoken', function (e) {
var str = e.token.value,
flag = false,
i, l;
for(i = 0, l = listOfTags.length; i < l; i++){
if (listOfTags[i]['value'] === str){
flag = true;
break;
}
}
if (!flag){
e.token = false;
}
});
}
var options = allBindings().tagsOptions,
currentTagsList = Helper.tags1List,
currentTagsInverted = Helper.tags1Inverted;
initializeTags(currentTagsList, $(element), 4);
ko.utils.registerEventHandler(element, "change", function () {
var tags = $(element).tokenfield('getTokens'),
tagsID = [],
observable = valueAccessor(), i, l, tagID;
for (i = 0, l = tags.length, tagID; i < l; i++){
tagID = currentTagsInverted[tags[i].value];
if (typeof tagID !== 'undefined'){
tagsID.push(parseInt(tagID));
}
}
observable( tagsID );
});
},
update: function(element, valueAccessor, allBindings) {
var arr = ko.utils.unwrapObservable(valueAccessor()),
options = allBindings().tagsOptions,
currentTags = Helper.tags1, tagsName = [], i, l, tagName;
if ( !(arr instanceof Array) ){
arr = [];
}
for (i = 0, l = arr.length, tagName; i < l; i++){
tagName = currentTags[arr[i]];
if (typeof tagName !== 'undefined'){
tagsName.push(tagName);
}
}
$(element).tokenfield('setTokens', tagsName);
}
};
但问题是我需要添加额外的标签:tag6
如果我只是这样做
Helper.getAllTags({
"1":{"value":"tag1"}, ..., "6":{"value":"tag6"}
})
它不起作用(这对我来说并不奇怪,我知道它为什么不起作用)。这样做的正确方法是什么。
附言
如果您认为我的绑定很糟糕,我同意您的看法,并且很乐意听到如何改进它。
如果您需要说明绑定是如何工作的,我很乐意提供。
拥有的想法
tags1, tags1List, tags1Inverted
是能够通过 id 或名称快速找到合适的标签(我有 500 个)。如果你想改变很多事情,欢迎你