【问题标题】:why doesn't this custom binding work?为什么这个自定义绑定不起作用?
【发布时间】:2013-10-01 13:26:15
【问题描述】:

我正在尝试将 tag-it 用于淘汰赛:

这是我的html:

<input placeholder="Tags" class="tagsInput" data-bind="tags:{}, tagitOptions: { initiateTags: myTags, tagSource: allMyTags, placeholder: 't-æ-g-g'}" /> 

在哪里

myTags = ko.observableArray([]);
allMytags = ko.observableArray([]);

我的绑定是这样的:

ko.bindingHandlers.tags = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var options = allBindingsAccessor().tagitOptions || {};

        $(element).tagit(options);

    },
    update: function (element, valueAccessor) {
        //I´ll leave this til later...
    }

}

Firebug 告诉我 options.initiateTags() = [ "myTag1", "myTag2" ] 和 options.placeholder = "t-æ-g-g"。 但 tagit 不显示我的initialTags。为什么?

【问题讨论】:

标签: jquery knockout.js tags tag-it


【解决方案1】:

如果您在 tagitOptions 中使用 observable 属性,那么您需要在将它们传递给 tagit 之前解包它们。

最简单的选择是使用ko.toJS 函数,它将可观察属性递归地转换为常规属性。

所以修改你的init函数为:

init: function (element, valueAccessor, allBindingsAccessor) {
    var options = allBindingsAccessor().tagitOptions || {};

    $(element).tagit(ko.toJS(options));
},

但要让它真正起作用:

tagIt 插件不能很好地与 Knockout 配合使用,因此要使其正常工作,您需要在 tag 之前使用 value 绑定,您可以在其中指定输入的当前值:

<input placeholder="Tags" class="tagsInput" 
   data-bind="value: myTags, tags:{}, 
           tagitOptions: { availableTags: myTags, placeholderText: 't-æ-g-g'}" />

在您的绑定处理程序中,您需要使用setTimeout 技巧:

init: function (element, valueAccessor, allBindingsAccessor) {
    var options = allBindingsAccessor().tagitOptions || {};

    setTimeout(function (){$(element).tagit(ko.toJS(options))},1);

},

演示JSFiddle.

【讨论】:

  • 非常感谢,nemesv! :) 现在我知道它是如何工作的,我必须弄清楚为什么“availableTags”没有作为标签放在作为手风琴一部分的输入字段中,如下所示:jsfiddle.net/MH6f4/1
  • @AsleG 到目前为止你还没有谈论过手风琴,所以现在这是一个不同的问题......但如果需要一些帮助,你需要让你的 jsFiddle 至少在手风琴部分工作,或者你需要发布你的 jqAccordion 绑定...因为没有 jqAccordion 绑定它可以工作:jsfiddle.net/nemesv/MH6f4/2
  • 我知道我没有提到手风琴。我试图隔离问题,因为复杂性很快就会失控,正如您在这次尝试中看到的那样:jsfiddle.net/MH6f4/4 ;) 即使小提琴不起作用,jqAccordion 也可以在我的计算机中工作(tagit-input 不起作用)。如果我没有把你弄糊涂的话,也许你能看出哪里不对劲了?
  • 我已经修复了我在控制台中看到的所有错误。标签编辑器现在工作正常:jsfiddle.net/vpGd9
  • 谢谢,nemesv。 :) 我想我在制作小提琴时引入了这些错误。事情是我仍然无法让它在我的电脑上工作。两个问题:标签处理程序中的 setTimeout() 出于某种(非常)奇怪的原因中断了我填充 TaskTags 数组的 fiddler 等效 for 循环。 (在我的计算机上的效果:在手风琴之外,我有一个带有 data-bind="with SelectedTask" 的“div”跨越“TaskTag”-array 并且只显示第一个标签。)如果这个行为恢复正常,如果我注释掉 setTimeout 函数,只留下“$(element).tagit(ko.toJS(options))”这一行。
猜你喜欢
  • 2012-07-05
  • 2016-04-25
  • 2010-10-26
  • 2017-06-07
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多