【问题标题】:Dropdown menu with icon in Knockout淘汰赛中带有图标的下拉菜单
【发布时间】:2017-11-03 15:54:47
【问题描述】:

是否有任何可能的方法可以为每个单独的选项值创建一个具有与 fontawesome 不同的图标的下拉菜单?或者我可以更改每个值的背景颜色吗?我更喜欢 fontawesome 中的圆形图标,我可以在其中更改列表中每条记录的颜色。

我尝试在html部分添加一个Icon的Fontawesomecode

<select data-bind="options: someList, optionsText: 'dropdownItemName', optionsValue: 'dropdownItemId', value: selectedSomeList, optionsCaption: ''" style="font-family: FontAwesome">&#xf111;</select>

我也尝试将它添加到 &lt;i&gt;&lt;/i&gt; 标记中,但它什么也没做。

有人有想法吗?谢谢你的帮助

【问题讨论】:

    标签: javascript html knockout.js font-awesome


    【解决方案1】:

    您可以在optionText 绑定中为图标添加Unicode(在 font-awesome 的网站上为每个图标指定了 Unicode 值):

    var viewModel = function() {
      
      this.values = ko.observableArray([{
        text: 'address-book \uf2b9',
        value: 1
      }, {
        text: 'bookmark \uf02e',
        value: 2
      }, {
        text: 'location-arrow \uf124',
        value: 3
      }]);
      
      this.selectedValue = ko.observable(2);
    }
    
    ko.applyBindings(new viewModel());
    select {
      font-family: 'FontAwesome', 'Second Font name'
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
    
    <select data-bind="options: values, 
                      optionsText: 'text', 
                      optionsValue: 'value', 
                      value: selectedValue">
    </select>

    (我从this answer借用了这个想法。但是,它显示为&amp;#xf042;而不是图标。花了一段时间才弄清楚)

    【讨论】:

    • @loonybin np。这是双赢的,因为我在这个过程中学到了一些关于 Unicode 的东西 :)
    【解决方案2】:

    我可能会迟到。但是试试这个。 jsfiddle

    var viewModel = function() {
      
      this.values = ko.observableArray([{
        text: 'Visa',
        value: 1,
        icon:'fa-cc-visa'
      }, {
        text: 'Discover',
        value: 2,
        icon:'fa-cc-discover'
      }, {
        text: 'Amex',
        value: 3,
        icon:'fa-cc-amex'
      }]);
      
      OptionsAfterRender = (option, item) => {
            
            ko.applyBindingsToNode(option, { css:  item.icon }, item);
        };
      
      
      this.selectedValue = ko.observable(2);
    }
    
    ko.applyBindings(new viewModel());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
    
    <select style="font-family:fontAwesome" multiple="multiple" size="3" data-bind="options: values, 
                      optionsText: 'text', 
                      optionsValue: 'value', 
                      value: selectedValue,
                      optionsAfterRender:OptionsAfterRender">
    </select>

    【讨论】:

    • 您好 Navya,您的回答很好。我尝试了您的答案,它实际上对我不起作用,但后来我运行了您提供的代码 sn-p,您的似乎工作正常。调试后,我意识到您在绑定到您的类之前添加了 ::before。但我试着做同样的事情。似乎没有帮助。你能告诉我你是如何在课堂上激活 ::before 的吗?
    • 嗨 Kavya,我将样式应用到了下拉列表本身。如果您查看我的下拉列表,我将样式属性设置为“font-family:fontAwesome”。除了将样式属性添加到下拉列表之外,我还没有向我的 dorpdown 和类添加任何自定义样式。
    • 您好 Navya,谢谢您的回答。实际上,如果没有属性 multiple="multiple",伪元素实际上并不能很好地与 Select 和 Option 标签配合使用。没关系,我找到了解决方法。我将 optionsText 替换为 optionsText: (ele) => unicodesObj[ele.icon] + '\t' + ele.text
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多