【问题标题】:Knockout: foreach not working with asp.net mvc淘汰赛:foreach 不适用于 asp.net mvc
【发布时间】:2014-08-05 10:34:54
【问题描述】:

我知道这可能很容易,但不知何故我无法为淘汰绑定实现 foreach。代码如下:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section scripts
{
    <script type="text/javascript">
        ko.applyBindings({
            people: [
                { firstName: 'Bert', lastName: 'Bertington' },
                { firstName: 'Charles', lastName: 'Charlesforth' },
                { firstName: 'Denise', lastName: 'Dentiste' }
            ]
        });
    </script>
}

    <div>
        <table>
            <thead>
                <tr><th>First name</th><th>Last name</th></tr>
            </thead>
            <tbody data-bind="foreach: people">
                <tr>
                    <td data-bind="text: firstName"></td>
                    <td data-bind="text: lastName"></td>
                </tr>
            </tbody>
        </table>
    </div>

而渲染出来的HTML如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> - My ASP.NET Application</title>
    <link href="/Content/bootstrap.css" rel="stylesheet"/>
<link href="/Content/site.css" rel="stylesheet"/>

    <script src="/Scripts/modernizr-2.6.2.js"></script>


</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="/">Application name</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a href="/">Home</a></li>
                    <li><a href="/Home/About">About</a></li>
                    <li><a href="/Home/Contact">Contact</a></li>
                </ul>
            </div>
        </div>
    </div>
    <div class="container body-content">
          
    <div>
        <table>
            <thead>
                <tr><th>First name</th><th>Last name</th></tr>
            </thead>
            <tbody data-bind="foreach: people">
                <tr>
                    <td data-bind="text: firstName"></td>
                    <td data-bind="text: lastName"></td>
                </tr>
            </tbody>
        </table>
    </div>

        <hr />
        <footer>
            <p>&copy; 2014 - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="/Scripts/jquery-1.10.2.js"></script>

    <script src="/Scripts/bootstrap.js"></script>
<script src="/Scripts/respond.js"></script>

    <script src="/Scripts/knockout.debug.js"></script>
<script src="/Scripts/knockout.mapping-latest.debug.js"></script>

    
    <script src="/Scripts/knockout.js"></script>
    <script src="/Scripts/knockout.mapping-latest.js"></script>
    <script type="text/javascript">
        ko.applyBindings({
            people: [
                { firstName: 'Bert', lastName: 'Bertington' },
                { firstName: 'Charles', lastName: 'Charlesforth' },
                { firstName: 'Denise', lastName: 'Dentiste' }
            ]
        });
    </script>

</body>
</html>

问题是 foreach 不能像代码中实现的那样工作。我得到的错误是(使用 Knockout 上下文调试):

ExtensionError:TypeError 消息:“调用了 Object.getOwnPropertyNames 在非对象上”堆栈:(...)获取堆栈:函数(){[本机代码]} 设置堆栈:函数(){[本机代码]} proto:错误信息:“请选择带有 ko 数据的 dom 节点。”

Uncaught TypeError: undefined is not a function

我已经尝试了一段时间,但没有成功。 谢谢。

【问题讨论】:

  • 为什么要包含knockout.jsknockout.mapping.js两次?
  • 您已将淘汰赛纳​​入两次。一次在您的布局中,一次在您的视图中。从您的@section scripts 中删除&lt;script src="~/Scripts/knockout.js"&gt;&lt;/script&gt; &lt;script src="~/Scripts/knockout.mapping-latest.js"&gt;&lt;/script&gt;
  • @nemesv - 我从视图中删除了脚本,但仍然遇到同样的错误。
  • @haim770 - 我已经更新了代码,但问题仍然存在

标签: asp.net-mvc knockout.js knockout-2.0 knockout-mvc


【解决方案1】:

所以我解决了!

问题是淘汰赛2.0有一行代码:

var elems = jQuery['clean']([html]);

但是我使用的 jQuery 1.10 弃用了 clean 方法。 所以我将我的淘汰赛升级到 3.0 并且成功了!

感谢@Boaz 回答这个question on stackoverflow

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2014-04-13
    • 2013-03-08
    • 2016-05-20
    • 2018-03-25
    • 2016-11-03
    • 1970-01-01
    • 2015-03-01
    • 2020-06-22
    相关资源
    最近更新 更多