javascript - Knockout.js,依赖于 Observable 的条件 Observable?

标签 javascript knockout.js

这里对 KOjs 和 STOF 有点菜鸟,有个问题,

我有一个可观察量,它们的数据是数字 0、1、2 或 3。我希望其他可观察量保存由该数据有条件设置的数据。

示例

this.isText = ko.observable(data.isText);
this.formatted.isText = ko.computed(function() {
    var it = self.isText();
    if (it == '0') {
      return 'No';
    }
    else if (it == '1') {
      return 'Yes'
    }
    else {
      return 'Not Specified'
    }
  });

我的示例代码片段未按预期运行。

实现保存可观察 isText 的格式化文本版本的正确方法是什么?

<小时/>

对象是如何创建的,

function ListItem(data) {
    this.isText = ko.observable(data.isText);
    this.formatted.isText = ko.computed(function() {
        var it = self.isText();
        if (it == '0') {
            return 'No';
        }
        else if (it == '1') {
            return 'Yes'
        }
        else {
            return 'Not Specified'
        }
    });
}

this.loadList = function(data) {
    // console.log(data);
    $.getJSON('someLoader.php', {
      checklistID: data.id,
      checklistRev: data.rev
    }, function(json, textStatus) {
      if (textStatus == 'success') {
        for (var i = 0; i < json.length; i++) {
          model.formData.push(new ListItem(json[i]));
        }
      }
      else {
        console.log('Error Competing Request');
      }
    });
  }

HTML,

<td colspan="1">
    <select class="form-control" data-bind="visible: status().edit, value: isText()">
        <option value="1">Yes</option>
        <option value="0">No</option>
    </select>
    <span data-bind="text: formated.isText(), visible: !status().edit()"></span>
</td>

一切作为一个整体工作,可观察量得到正确声明,没有错误,第一次加载时一切看起来都正常。如果 isText() 可观察值更新,但 formatted.isText() 不会更新以反射(reflect)更改。如果我在终端中进行控制台登录,则 isText() 的值是否正确取决于它是否已更新。因此,在初始加载时,如果它为 1 并且更新为 0,它将保留值 0。

最佳答案

我认为您想要做的是将计算值附加到其父可观察值。我见过 RNiemeyer 经常使用这种技术来保持代码更简洁,尤其是在序列化 View 模型时。如果是这样,那么我认为你想要做的是交换 formatted.isText 中“isText”和“formatted”的顺序.

正如 Thibaut Remy 的回答已经暗示的那样,你不能将计算附加到任何东西上,并且由于“格式化”已经不是你基本上说的东西 undefined.isText = ko.computed(...)相反,您应该将计算值附加到现有的可观察值: this.isText.formatted = ko.computed(...) ,并在您的绑定(bind)中类似地调用它: <span data-bind="text: isText.formatted(), visible: !status().edit()"></span> .

这是一个jsfiddle

关于javascript - Knockout.js,依赖于 Observable 的条件 Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700711/

相关文章:

javascript - 使用动态名称创建 KnockoutJS 可观察对象

javascript - 将数组的值填充到复选框的 bool 值

javascript - 根据 Vuex 状态有条件地渲染模态

javascript - 如何使用动态变量到 Angular

javascript - 根据用户选择 knockout 更改数据绑定(bind)

javascript - 动态创建的下拉列表未给出正确的值

javascript - 如果没有类(class),则自动单击按钮

php - 为什么 php 表单生成器类没有运行?

knockout.js - 如何根据事件更改 knockout 验证

非 SPA 的 JavaScript 架构