Knockout.js,有条件的Observable取决于Observable?

时间:2017-03-09 16:36:50

标签: javascript knockout.js

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

我有一个observable(s),他们的数据是数字0,1,2或3.我希望其他可观察数据保存由这些数据有条件设置的数据。

例如

[ { ServerTypeName: 'App       ' },
{ ServerTypeName: 'Oracle    ' },
{ ServerTypeName: 'Weblogic  ' } ]

我的示例代码段无法按预期运行。

实现保存可观察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

HTML,

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');
      }
    });
  }

作为一个整体的一切工作observables正确声明没有错误,在第一次加载一切看起来没问题。如果<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> observable已更新,但isText()未更新以反映更改。如果我在终端中执行控制台日志,则isText()的值是正确的,具体取决于它是否已更新。因此,在初始加载时,如果它为1并且更新为0,则保留值0。

2 个答案:

答案 0 :(得分:1)

我猜您的示例不起作用,因为IsSelected未定义。为了解决这个问题,您可以(并且应该)使用另一个变量名而不是尝试嵌套变量:

db.Tournaments.Include(t => t.Games.Select(g => g.Team1)).ToList();

答案 1 :(得分:1)

我认为你要做的是将一个计算器附加到其父observable。这是我见过的一种技术,我经常被RNiemeyer用来保存更清晰的代码,尤其是在序列化视图模型时。如果是这样,那么我认为您要做的是在formatted.isText中交换“isText”和“formatted”的顺序。

正如Thibaut Remy的回答已经暗示的那样,你不能将计算结果附加到任何东西,因为“格式化”不是你已基本说过的事情undefined.isText = ko.computed(...)而是你应该将计算结果附加到现有的observable:this.isText.formatted = ko.computed(...),并在绑定中以相似的方式调用它:<span data-bind="text: isText.formatted(), visible: !status().edit()"></span>

这是jsfiddle