【问题标题】:Knockout data-binding to viewModel剔除数据绑定到 viewModel
【发布时间】:2017-06-21 18:21:28
【问题描述】:

我有这样的看法:

@model Store.WebUI.Models.CartIndexViewModel

@{
    ViewBag.Title = "Your Cart";
}

<script type="text/javascript" src="~/Scripts/knockout-3.4.2.js"></script>
<script type="text/javascript" src="~/Scripts/knockout.mapping-latest.js">
</script>
<script type="text/javascript">
    var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
    var viewModel = ko.mapping.fromJS(data);
    ko.applyBindings(viewModel);
</script>

<h2>Your cart</h2>
<table id="cartTable" class="table">
    <thead>
    <tr>
        <th>Quantity</th>
        <th>Item</th>
        <th class="text-right">Price</th>
    </tr>
    </thead>
    <tbody data-bind="foreach: Lines">
    <tr>
        <td data-bind="text: Quantity"></td>
        <td data-bind="text: Product.Name"></td>
        <td data-bind="text: Product.Price"></td>
    </tr>
    </tbody>
</table>

并且由于某种原因,值没有绑定到表列,即使在 Chrome 中调试期间我可以看到我的脚本中的变量“数据”如下所示:

var data = {"Cart":{"Lines":[{"Product":{"ProductId":2,"Name":"Game","Description":"Some Game","Category":"Games","Price":29.99},"Quantity":1}]},"ReturnUrl":"/Games"};

一般来说,我是淘汰赛和 jQuery 的新手,我不明白我在这里缺少什么。

【问题讨论】:

    标签: jquery knockout.js


    【解决方案1】:

    观察你的对象结构:

    {
      "Cart": {
        "Lines": [...]
      }
    }
    

    需要注意的是LinesCart之内。由于您没有告诉 KO 如何导航到那里,因此屏幕上不会出现任何内容。你可以这样解决问题:

    <table id="cartTable" class="table" data-bind="with: Cart">
        <thead>
        <tr>
            <th>Quantity</th>
            <th>Item</th>
            <th class="text-right">Price</th>
        </tr>
        </thead>
        <tbody data-bind="foreach: Lines">
        <tr>
            <td data-bind="text: Quantity"></td>
            <td data-bind="text: Product.Name"></td>
            <td data-bind="text: Product.Price"></td>
        </tr>
    </tbody>
    </table>
    

    注意data-bind="with: Cart" 绑定。这导致 KO 使用嵌入的 Cart 对象作为绑定上下文,瞧,Lines 成为有效引用。

    您还需要从here 下载KO Mapping 插件,否则对ko.mapping.fromJS 的调用将失败。

    【讨论】:

    • 天啊,这太有道理了!
    • 等等,不应该是viewModel.Cart吗?与购物车的简单数据绑定似乎没有做任何事情。有没有一种调试视图以跟踪被绑定的值的好方法?
    • 它在这个小提琴中对我有用:jsfiddle.net/rzso11jL 但是,如果我像你一样使用ko.mapping.fromJS,我会收到一个错误,如控制台中所示。就个人而言,我从未使用过那个助手,所以我不能添加太多。
    • viewModel.Cart 不好,因为viewModel 变量本身就是绑定根。也就是说,它是KO可以看到的对象结构的顶部; KO 看不到您的全局变量。为此,您不能引用viewModel...
    • ... 这是因为您将viewModel 变量传递给applyBindings。因此,您传递给该方法的任何内容都将成为您的绑定根,并且您使用的任何属性名称都必须存在于该对象中。例如,如果您传递了window(说些蠢话),那么是的,您还需要导航到Cart
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2023-03-15
    • 2018-02-02
    • 1970-01-01
    • 2012-11-15
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多