【问题标题】:containerless flow control syntax on select not working in IE8选择上的无容器流控制语法在 IE8 中不起作用
【发布时间】:2013-09-25 23:56:29
【问题描述】:

我正在使用无容器流控制语法来确定当用户进入编辑模式时是否应在选择列表中显示项目。我似乎在使用 IE8 时遇到了麻烦。从我一直在阅读的内容中,IE8 删除了选择中的 cmets。伟大的。

我看到的选项

  1. 再次调用服务层获取列表 I 需要。
  2. 我尝试弄乱 doctype,但它位于 使用框架集的旧旧应用程序,我无法更改它或它 会破坏网站的其他部分。文档类型集是: http-equiv="X-UA-Compatible" content="IE=EmulateIE8"
  3. 以某种方式将 html 注入到选择列表中,可能来自敲除或 jquery

有没有办法让它跨浏览器工作,而不必为最终列表进行额外的服务调用?

这是我的选择列表代码

<tr>
                <td><label for="EditStatus">Status</label></td>
                <td><select id="EditStatus" class="" name="EditStatus" data-bind="value: editStatus" >
                        <option value="" selected>Select...</option>
                        <!-- ko if: editStatusCanShowActive()  -->
                        <option value="A">Active</option>
                        <!-- /ko -->
                        <!-- ko if: editStatusCanShowInactive() -->
                        <option value="I">Inactive</option>
                        <!-- /ko -->
                        <!-- ko if: editStatusCanShowHold() -->
                        <option value="H">Hold</option>
                        <!-- /ko -->
                        <!-- ko if: editStatusCanShowLocked() -->
                        <option value="L">Locked</option>
                        <!-- /ko -->
                    </select></td>
            </tr>

【问题讨论】:

  • doctype 集是:http-equiv="X-UA-Compatible" content="IE=EmulateIE8" ...呃,那不应该在文档类型;那是一个元标记。您还需要一个文档类型。由于它与问题相关,因此您可能应该在问题中包含您的文档类型和元标记的确切代码,以避免任何混淆。
  • 您是正确的,因为它是元标记。对困惑感到抱歉。我想我找到了我标记的答案。

标签: jquery knockout.js cross-browser ie8-browser-mode


【解决方案1】:

还有另一个更好的选择。使用计算的 observable 来构建您的选项数组,如下所示:

this.status = ko.computed(function() {
    var options = [];
    if (this.editStatusCanShowActive()) {
        options.push('Active');
    }
    if (this.editStatusCanShowInactive()) {
        options.push('Inactive');
    }
    if (this.editStatusCanShowHold()) {
        options.push('Hold');
    }
    if (this.editStatusCanShowLocked()) {
        options.push('Locked');
    }
    return options;
}, this);

这是一个工作示例:http://jsfiddle.net/badsyntax/8FvMR/

【讨论】:

  • 将您的评论标记为有用,因为它是第一篇文章并且是正确的,除了我正在寻找如何根据我的单个字符设置值。
【解决方案2】:

一种选择是在您的视图模型中构建一个列表,例如:

this.availableStatuses = ko.computed(function() {
   var statuses = [];

    if (this.editStatusCanShowActive()) {
        statuses.push({ name: "Active", value: "A" });   
    }

    if (this.editStatusCanShowInactive()) {
        statuses.push({ name: "Inactive", value: "I" });   
    }

    if (this.editStatusCanShowHold)) {
        statuses.push({ name: "Hold", value: "H" });   
    }

    if (this.editStatusCanShowLocked()) {
        statuses.push({ name: "Locked", value: "I" });   
    }

    return statuses;

}, this);

然后,在你的 UI 中绑定,如下所示:

<select data-bind="options: availableStatuses, optionsText: 'name', optionsValue: 'value', value: editStatus"></select>

【讨论】:

  • 也许在发布之前查看答案?这几乎是我答案的精确副本。
  • 除了使用“editStatusCanShowInactive”的解决方案存在复制/粘贴问题外,我将其标记为答案,因为您添加了基于我使用的单个字符设置的值。
  • @badsyntax - 我同时打字并发布。没有看到你的答案。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2012-08-26
  • 2013-03-08
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多