【问题标题】:How do I use a computed function to specify the CSS binding within a foreach observable array如何使用计算函数在 foreach 可观察数组中指定 CSS 绑定
【发布时间】:2013-09-21 16:06:47
【问题描述】:

我有一个页面列出了多个项目,这些项目是可观察数组中的轻量级实体。使用 foreach 循环,我希望标签的 CSS 根据项目的状态而变化。
因为我使用的是轻风,所以我定义了var projects = ko.observableArray();,而轻风负责其余的工作,包括来自相关实体 (projectStatus) 的值。 对于我要设置样式的元素,它存在于foreach: projects 列表中,并具有data-bind="text: projectStatus().name 的绑定。这完美地工作。但是,当我在视图模型中为 CSS 值编写计算出的 observable 时,它​​会在第 3 行(如下)引发未定义的错误。否则(我已经检查过)如果函数返回有效字符串,则该函数适用于 CSS:

    projectStatusStyle = ko.computed(function () {
    var x = "left label label-large label-info";

    var projStatus = projects().projectStatus().name();

    var style = "left label label-large label-"
    switch (projStatus) {
        case 'Live':
            x = style + "success";
            break;
        case 'Identified':
            x = style + "info";
            break;

        case 'In conversation':
            x = style + "purple";
            break;

        case 'Complete':
            x = style + "grey";
            break;
        case 'Unsuccessful':
            x = style + "yellow";
            break;

    }
    return x;
},vm);

所以我的问题是,我应该如何引用 projects().projectStatus().name();可观察值?

谢谢

【问题讨论】:

  • 请显示项目和项目状态
  • 第二个@PWKad,您需要显示更多代码。设身处地为我们着想,仅凭您提供的代码我们无法重现该问题。
  • 点@Jeroen。我最好将其表述为一个问题:是否可以以引用当前 observable 的方式使用淘汰赛动态 css 绑定。我知道你不能将参数传递给计算函数,所以也许自定义绑定处理程序是一个选项,你可以在 valueaccessor 处获得?

标签: knockout.js breeze


【解决方案1】:

如果不查看其余代码,很难判断,但我认为您遇到了上下文问题。您正在视图模型上定义计算的可观察对象,但您的代码有点假设它是在项目可观察数组中的每个对象上定义的。不是,所以你的第三行不能工作。它是在视图模型上定义的,它无法知道或跟踪您引用的 foreach 中的哪个项目。

您有几个选择。您可以将 projectStatusStyle 更改为视图模型上的一个函数,该函数将名称作为参数:

vm.projectStatusStyle = function (projStatusName) {
  var x = "left label label-large label-info";

  var style = "left label label-large label-"
  switch (projStatusName()) {
    case 'Live':
        x = style + "success";
        break;
    case 'Identified':
        x = style + "info";
        break;

    case 'In conversation':
        x = style + "purple";
        break;

    case 'Complete':
        x = style + "grey";
        break;
    case 'Unsuccessful':
        x = style + "yellow";
        break;

  }
  return x;
};

然后你可以有一个像

这样的绑定
<span data-bind="css: $root.projectStatusStyle(projectStatus().name)"/>

您可以使用$root$parent,具体取决于您的视图模型是如何定义的。

老实说,我可能会在你的 foreach 中这样做:

<span class="left label label-large"
  data-bind="css: {'label-info': projectStatus().name() === 'Identified', 
  'label-success': projectStatus().name() === 'Live', 
  'label-purple': projectStatus().name() === 'In conversation', 
  'label-grey': projectStatus().name() === 'Complete', 
  'label-yellow': projectStatus().name() === 'Unsuccessful'}"/>

这样您就不会将样式信息放入 JS 模型代码中。

【讨论】:

  • 你完全正确@JeffB,视图模型无法知道哪个项目在范围内。我无法让您的函数解决方案工作 - 我认为淘汰赛的动态 css 不能接受参数,但是内联解决方案确实有效,所以我会使用它 - 谢谢。我原以为会有一个基于函数的解决方案,因为其他样式的规则可能会变得相当复杂,我通常会尽量保持我的 html 文件尽可能简单。
  • 它应该可以工作,尽管在我的示例中我使用的是样式而不是 css。这是一个示例 jsFiddle:jsfiddle.net/fmnwQ。这也可能取决于您的 Knockout 版本。我认为 2.2 添加了动态 CSS 功能。无论如何,很高兴我能提供帮助。
  • 它有效@JeffB。因此,您可以在函数中传递对象,并且不需要 ko.computed 函数 - 因为此绑定会观察值的变化。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 2016-01-01
  • 2015-11-30
  • 2017-07-26
  • 2017-09-05
  • 1970-01-01
  • 2017-11-25
  • 2015-03-05
相关资源
最近更新 更多