Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用KnockoutJS和Knockout-mapper.js的DataTables绑定不起作用_Javascript_C#_Asp.net Mvc_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Javascript 使用KnockoutJS和Knockout-mapper.js的DataTables绑定不起作用

Javascript 使用KnockoutJS和Knockout-mapper.js的DataTables绑定不起作用,javascript,c#,asp.net-mvc,knockout.js,knockout-mapping-plugin,Javascript,C#,Asp.net Mvc,Knockout.js,Knockout Mapping Plugin,我有一个关于如何使用KnockoutJS和knockoutmapper绑定数据表的教程。从我所看到的,我只需要给我的对象和应用绑定到表,但当我这样做时,我并没有得到任何错误和显示数据。我错过了什么 控制器JSON数据: public virtual JsonResult GetRecordsJsonResult() { var userBusinessLogic = InterfaceResolver.ResolveWithTransaction<IUserBusi

我有一个关于如何使用KnockoutJS和knockoutmapper绑定数据表的教程。从我所看到的,我只需要给我的对象和应用绑定到表,但当我这样做时,我并没有得到任何错误和显示数据。我错过了什么

控制器JSON数据:

public virtual JsonResult GetRecordsJsonResult()
    {
        var userBusinessLogic = InterfaceResolver.ResolveWithTransaction<IUserBusinessLogic>();
        var records = userBusinessLogic.GetAll().Select(x => new
        {
            x.Id,
            x.FirstName,
            x.LastName,
            x.Email
        }).OrderBy(i => i.Id);

        var data = Json(new
        {
            max = records.Count(),
            items = records
        }, JsonRequestBehavior.AllowGet);

        return data;
    }
我得到的JSON数据示例

HTML:

来自浏览器的控制台日志:


我想在我如何从控制器获取项目时可能会有错误,因为当我遵循教程时,一切都正常。有什么想法吗?谢谢您的时间。

是的,上面的例子有很多错误。。。这是最简单的解决方案,可以让淘汰赛很好地处理数据表

此解决方案使用我创建的自定义绑定,该绑定依赖于敲除叉。如果您喜欢此解决方案,请在pull请求上留下评论,以便合并intp knockout 3.4,谢谢


它是否显示不带$items行的表。DataTable{responsive:true};?还用谢谢你,我很想念你
<script type="text/javascript">

    $(function () {
        function viewModel(data) {
            console.log("viewModel");
            var self = this;
            ko.mapping.fromJS(data, {}, self);
            console.log(self);
            console.log("data");
            console.log(data);
        }
        $.ajax({
            url: "@Url.Action("GetRecordsJsonResult")", success: function (data) {
                ko.applyBindings(new viewModel(data));
                $("#items").DataTable({ responsive: true });
            }
        });
    });

 </script>

<table id="items" class="display table table-striped table-responsive table-bordered table-hover">
    <thead>
        <tr>
            <th>ID</th>
            <th>First name</th>
            <th>Last name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span data-bind="text: $data.Id"></span></td>
            <td><span data-bind="text: $data.FirstName"></span></td>
            <td><span data-bind="text: $data.LastName"></span></td>
            <td><span data-bind="text: $data.Emaiol"></span></td>
        </tr>
    </tbody>
</table>
ko.bindingHandlers.DataTablesForEach = {

        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
             var nodes = Array.prototype.slice.call(element.childNodes, 0);
            ko.utils.arrayForEach(nodes, function (node) {
                if (node && node.nodeType !== 1) {
                    node.parentNode.removeChild(node);
                }
            });
            return ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
        },
        update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

            var value = ko.unwrap(valueAccessor()),
            key = "DataTablesForEach_Initialized";

            var newValue = function () {
                return {
                    data: value.data || value,
                    beforeRenderAll: function (el, index, data) {

                        if (ko.utils.domData.get(element, key)) {
                            $(element).closest('table').DataTable().clear();
                            $(element).closest('table').DataTable().destroy();
                        }
                    },
                    afterRenderAll: function (el, index, data) {
                        $(element).closest('table').DataTable(value.options);
                    }

                };
            };

            ko.bindingHandlers.foreach.update(element, newValue, allBindingsAccessor, viewModel, bindingContext);

            //if we have not previously marked this as initialized and there is currently items in the array, then cache on the element that it has been initialized
            if (!ko.utils.domData.get(element, key) && (value.data || value.length)) {
                ko.utils.domData.set(element, key, true);
            }

            return { controlsDescendantBindings: true };
        }
    };