淘汰foreach绑定不呈现任何内容

时间:2016-06-01 19:35:44

标签: javascript knockout.js

我有,我认为这是一个相当直接的淘汰局面。我有一个来自WebApi的模型,它包含一个带有Success元素的数组。我需要成功的价值来确定呈现的属性。我已经验证所有数据都来自WebApi,但除了表shell外,其他任何内容都会呈现。开发控制台中没有错误。

HTML

<div id="model1Wrapper">
<table class = "table">
    <thead >
        <tr >
            <th >Stuff</th><th>Things</th> 
        </tr> 
    </thead>
    <tbody data-bind = "foreach: $data.historyArray" >
        <!--ko if: Success -->
        <tr class = "success" >
            <td data-bind = "text: $data.ThingA" > </td>
            <td data-bind = "text: ThingB" > </td> 
        </tr>
        <!-- /ko -->

        <!--ko ifnot: Success -->
        <tr class = "danger" >
            <td colspan="3" data-bind = "text: ThingC" > </td>
        </tr>
        <!-- /ko -->
    </tbody> 
</table>
</div>

示例模型数据

[{
    "ThingA": "A",
    "ThingB": "B",
    "ThingC": "C",
    "Success": false
}, {
    "ThingA": "A",
    "ThingB": "B",
    "ThingC": "C",
    "Success": true
}]

这是监控来自多个端点的进程,因此我在页面上有多个ViewModel。所以我在页面的其他地方制作了一个粗略的例子。

该业务

<script>
    var sampleModelData = [{
        "ThingA": "A",
        "ThingB": "B",
        "ThingC": "C",
        "Success": false
    }, {
        "ThingA": "A",
        "ThingB": "B",
        "ThingC": "C",
        "Success": true
    }]


    var viewModel1 = {
        historyArray: ko.observableArray()
    };

    function onNewHistory(data) {
        viewModel1.historyArray(data);
    }

    $(document).ready(function(){
        ko.applyBindings(viewModel1, document.getElementById("model1Wrapper"));
        onNewHistory(sampleModelData);
    })

</script>

我不得不掩盖一些特殊情况,但要点是,ajax调用在示例中返回一个数组。有一个函数被调用来将新数据更新为observable,我希望该表能够重新呈现,但事实并非如此。

其他deets

  • 有时表格中没有模型数据,所以我加载并等待 进行更新。所有其他Viewmodel都是这样加载的 是唯一一个有阵列的人,也是唯一一个遇到麻烦的人 用。
  • 我已尝试取出if / ifnot业务但不起作用。

  • Fiddler讨厌我,我无法设置一个干净的版本来尝试。

  • 我提出了一些相关的问题,似乎没有什么适合我的问题。或者这个例子要复杂得多。

谢谢!

2 个答案:

答案 0 :(得分:4)

问题在于此代码:

var viewModel1 = {
    historyArray = ko.observableArray();
}

您将声明对象的语法与函数内部代码的语法混合在一起。声明对象时,请勿使用=;。而是使用:,

如果您将声明更改为以下内容,则应该可以正常工作。

var viewModel1 = {
    historyArray: ko.observableArray()
}

答案 1 :(得分:0)

只需为这个问题添加另一个答案,以防将来有人遇到它。我遇到了这个问题,这是在方法中初始化我的可观察数组的结果。我不是要这样做(复制粘贴错误),并且它在控制台中没有产生任何错误,因此很难跟踪。

例如:

LoadJSArrayIntoObservable(results) {
    vm.validationResults = ko.observableArray();  <---- THIS IS INVALID. 
    vm.validationResults([]);  <---- THIS IS WHAT I MEANT TO DO!!

    $.each(results, function () {
        try {
            vm.validationResults.push(new ValidationResult(this));
        }
        catch (err) {
            alert(err.message);
        }
    });