【问题标题】:Bootstrap's tooltip not working with knockout bindings? (w fiddle)Bootstrap 的工具提示不适用于淘汰赛绑定? (小提琴)
【发布时间】:2013-05-28 08:47:30
【问题描述】:

小提琴:http://jsfiddle.net/LkqTU/9399/

代码:

var ViewModel = function (first, last) {
    var self = this;
    self.showIcon = ko.observable(false);
    self.triggerIcon = function () {
        self.showIcon(true);
    };
};
$('.card-delete-button').tooltip({
    'placement': 'top',
        'title': 'Text'
});
ko.applyBindings(new ViewModel("Planet", "Earth"));

由于某种原因,“.card-delete-button”没有显示工具提示。我认为这是因为在触发 triggerIcon 函数之前,该 DOM 元素不可用。但是在应用程序中,我必须将这些工具提示绑定到许多不同的元素,并且宁愿在一个地方执行一次,而不是将绑定粘贴到 triggerIcon 函数中。如何实现?

【问题讨论】:

    标签: twitter-bootstrap knockout.js


    【解决方案1】:

    在这种情况下,您最好的选择是创建一个自定义绑定,您可以使用该绑定将工具提示放置在标记中的任何位置。

    这是一个工具提示绑定的实现:

    ko.bindingHandlers.tooltip = {
        init: function(element, valueAccessor) {
            var local = ko.utils.unwrapObservable(valueAccessor()),
                options = {};
    
            ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
            ko.utils.extend(options, local);
    
            $(element).tooltip(options);
    
            ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                $(element).tooltip("destroy");
            });
        },
        options: {
            placement: "right",
            trigger: "click"
        }
    };
    

    然后您将在您的页面上使用此绑定,例如:

    <input data-bind="value: name, tooltip: { title: help, trigger: 'hover' }" />
    

    您可以全局设置选项,然后用您传递到绑定中的任何内容覆盖它们。

    当您进入模板和控制流场景时,使用自定义绑定确实很有帮助,因为它会在正确的时间自动初始化(和清理),而无需手动知道何时调用代码。

    这是一个示例:http://jsfiddle.net/rniemeyer/BF5yW/

    【讨论】:

    • options: { container: 'body' } 对于工具提示宽度很重要
    【解决方案2】:

    @RP Niemeyer 回答的附录……

    在 github 上有一个名为 Knockout-Bootstrap 的小项目,用于“与 Bootstrap 和 Knockout 绑定进行丰富的双向交互”。

    下面是你的小提琴的一个分支,其中包括 Knockout-Bootstrap。

    http://jsfiddle.net/qZkXP/

    <div class='liveExample' data-bind="event: {mouseover: triggerIcon}">   
        <!-- ko if: showIcon -->
        <a class="card-delete-button" 
           data-bind="tooltip: {title: 'Another tooltip', placement: 'right'}">
               <i class="icon-trash"></i>
        </a>
        <!-- /ko -->
    </div>
    

    【讨论】:

      【解决方案3】:

      我还遇到了一些关于带有敲除的工具提示绑定的问题,RP Niemeyer 提供的答案帮助了我。但是,当我尝试绑定到返回工具提示的选项对象的函数时,它没有被调用(它只被调用过一次)。因此,如果我试图根据映射的 css 类动态更改工具提示的标题,它就不起作用。所以,我找到的解决方案是:

      ko.bindingHandlers["tooltip"] = {
      'init': function (element, valueAccessor) {
          var local = ko.utils.unwrapObservable(valueAccessor());
          var options = {};
      
          ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
          ko.utils.extend(options, local);
      
          $(element).tooltip(options);
      
          ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
              $(element).tooltip("destroy");
          });
      },
      'update': function (element, valueAccessor) {
          var local = ko.utils.unwrapObservable(valueAccessor());
          var options = {};
      
          ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
          ko.utils.extend(options, local);
      
          $(element).data("bs.tooltip").options.title = options.title;
      },
      options: {
          placement: "top",
          trigger: "click"
      }};
      

      我想在此处发表此评论,因为我认为这在必须动态更改工具提示标题的情况下很有用。

      【讨论】:

        【解决方案4】:

        Adi Mihasan 提供的答案几乎对我有用。我必须进行以下更改,这也可能对其他人有所帮助。

        $(element).tooltip("destroy");
        

        $(element).tooltip("dispose");
        

        $(element).data("bs.tooltip").options.title = options.title 
        

        $(element).data("bs.tooltip").config.title = options.title
        

        【讨论】:

          猜你喜欢
          • 2014-08-02
          • 2013-01-13
          • 2014-08-01
          • 2014-12-11
          • 2015-09-18
          • 2016-11-07
          • 2013-08-19
          • 2015-01-18
          • 2013-03-18
          相关资源
          最近更新 更多