【问题标题】:Knockout observable array not updating the UIKnockout observable 数组不更新 UI
【发布时间】:2015-07-14 20:06:02
【问题描述】:

我作为 WEB 服务调用并获取 JSON 数据。之后使用淘汰赛 Js 我绑定到一个表格中。之后,当用户在文本 bax 中键入内容时,它会过滤数据并显示在 UI 中。但目前它不起作用。请在下面找到代码。

 <script src="../../Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/knockout-3.3.0.js"></script>
@{
    ViewBag.Title = "AllTasks";
}

<script type="text/javascript">
    var viewModel;
    var url = 'http://localhost:22653/api/AllTasks';
    $(document).ready(function () {
        debugger;
        var FAJobViewModel = function () {
            var self = this;
            self.Parameters = ko.observableArray();
            var AllTask = JSON.parse(readJSON(url));
            function readJSON(file) {
                var request = new XMLHttpRequest();
                request.open('GET', file, false);
                request.send(null);
                if (request.status == 200)
                    return request.responseText;
            };
            self.Parameters = ko.observableArray(AllTask);


            self.query = ko.observable('');
            self.search = function (value) {
                self.JobIDParameters = ko.observableArray();
                debugger;
                for (var x in AllTask) {
                    if (AllTask[x].JobNumber.toLowerCase().indexOf(value.toLowerCase()) >= 0) {
                        self.JobIDParameters.push(AllTask[x]);
                    }
                }
                self.Parameters = self.JobIDParameters;

            };

        }
        viewModel = new FAJobViewModel();
        viewModel.query.subscribe(viewModel.search);
        ko.applyBindings(viewModel, document.getElementById("AllTask"));
    }
    );


</script>
<div id="AllTask" class=" container-fluid" style="margin-top:50px">
    <span>JobId</span><input id="txtSearch" placeholder="Search…" type="search" data-bind="value: query, valueUpdate: 'keyup'" autocomplete="off">
    <input type="button" id="btnSearch" value="Search" " />
    <table border="1">
        <thead>
            <tr>
                <th>Job Id</th>
                <th>Requestor</th>
                <th>Test Name</th>
                <th>Priority</th>
                <th>CreatedDate</th>
            </tr>
        </thead>
        <tbody data-bind="foreach:Parameters" class=" container-fluid">
            <tr>
                <td><span data-bind="text:JobNumber"></span></td>
                <td><span data-bind="text:Requestor"></span></td>
                <td><span data-bind="text:TaskAbbreviation"></span></td>
                <td><span data-bind="text:Priority"></span></td>
                <td><span data-bind="text:CreatedDate"></span></td>
            </tr>
        </tbody>
    </table>
</div>

【问题讨论】:

  • 试着把这个self.Parameters = self.JobIDParameters;变成这个self.Parameters(self.JobIDParameters())
  • 非常感谢这个工作......
  • 我该怎么做?
  • 如果您得到了解决方案,请将其标记为答案。这将对其他进来的人有用。

标签: knockout.js


【解决方案1】:

在分配结果过滤数据时存在问题,您需要避免使用 = 并改用 () 约定,这将保持双向绑定不变。

视图模型:

self.Original= ko.observableArray(AllTask);
self.Parameters = ko.observableArray(AllTask);
self.search = function (value) {
        if(!value){self.Parameters(self.Original())}
        var arr= [];
        ko.utils.arrayForeach(self.Original(),function(item){
        if (item.JobNumber().toLowerCase().indexOf(value.toLowerCase())>= 0)
             {
                 arr.push(item);
             }
        });
          self.Parameters(arr);
    };

我为正确的功能做了一些小改动。希望对您有所帮助。

【讨论】:

  • 我在localhost:22653/Home/AllTasks 0x800a138a 中的第 113 行第 21 列遇到了这样的未处理异常 - JavaScript 运行时错误:预期函数如果有针对此异常的处理程序,则程序可以安全地继续。
  • 您的jquery.js 或其他一些js 可能没有正确加载。检查控制台窗口并查看是否有任何错误。
猜你喜欢
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2013-08-08
相关资源
最近更新 更多