태그를 표시하려면 bootstrap-tokenfield과 typeahead의 녹아웃을 사용하고 있습니다. 이전에는 좋은 방법으로 태그를 표시하는 방법이 필요했기 때문에 맞춤 바인딩을 만들었습니다. 태그 목록이 변경되지 않고 선택한 태그 만 변경 될 때 정말 효과가있었습니다.맞춤 바인딩에 새 태그 추가
정말 간단한 예제 looks like this입니다. 보시다시피 다양한 태그 (tag1
, tag2
, ..., tag5
)를 입력 할 수 있으며 관찰 가능이 변경됩니다. 그래서 내 맞춤 바인딩이이 경우에 작동합니다.
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"}
})
을 할 경우 깜짝하지 않은 (작동하지 않습니다 나에게 그것이 왜 효과가 없는지를 안다). 이것을하는 것이 올바른 방법.
P. 내 바인딩 끔찍한이라고 생각하면
, 나는 당신과 동의하고 그것을 개선하는 방법들을하실 수 있습니다.
바인딩 작업에 대한 명확한 설명이 필요하면 기꺼이 제공해 드리겠습니다.
tags1, tags1List, tags1Inverted
의 아이디어는 ID 또는 이름 (나는 500 개가 있습니다)으로 적절한 태그를 빠르게 찾을 수 있어야합니다. 당신이 많은 일을 변경하려는 경우당신은
토큰이 토큰, id 등에 여분의 메타 데이터를 실제로 저장한다는 것 같습니다. – MrYellow