【问题标题】:Foreach only repeats last elementForeach 只重复最后一个元素
【发布时间】:2017-04-08 15:42:13
【问题描述】:

尝试学习 Knockout 并将其集成到 ASP.NET Core 应用程序中。这是我通过关注不同帖子所能获得的最远距离:

function DayViewModel(number, name /*others*/)
{
    this.dayNumber = number;
    this.dayName = name;
    //others
}

var MonthViewModel = function(days /*others*/)
{
    this.monthDays = ko.observableArray(days);
}

$(function ()
{
    var tempDays = [];

    @foreach(var day in Model.Days)
    {
        string dayName = day.DayNumber.ToString().PadLeft(2, '0') + " - " + Globals.GetDayName(Model.YearNumber, Model.MonthNumber, day.DayNumber, Globals.GetUICulture(Context));
        @:tempDays.push(DayViewModel(@day.DayNumber, "@dayName" /*others*/);
    }

    var monthViewModel = new MonthViewModel(tempDays /*others*/);
    ko.applyBindings(monthViewModel);
});

然后,表格:

<table id="mTable" class="table">
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => newModel.DayNumber)</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: monthDays">
        <tr>
            <td>
                <a href="#" data-bind="text: dayName"></a>
            </td>
        </tr>
    </tbody>
</table>

这会为数组中相同数量的项目正确生成 &lt;tr&gt; 元素,并且生成的 HTML 显示 tempDays 具有所有正确的项目。
为什么 Knockout 只重复最后一个元素呢?在文档中找不到我做错了什么?

【问题讨论】:

    标签: javascript jquery asp.net-mvc knockout.js asp.net-core


    【解决方案1】:

    您将需要创建MonthViewModel 的新实例,否则每次调用都会覆盖this,这会使最后一个MonthViewModel 改变所有人..

    @:tempDays.push(new DayViewModel(@day.DayNumber, "@dayName" /*others*/);

    这是一个没有 Razor 的小提琴:http://jsfiddle.net/LkqTU/32570/

    【讨论】:

    • 非常感谢,我感觉自己像个菜鸟。效果很好
    【解决方案2】:

    如果您在 angularjs 中执行此操作,请使用 ng-repeat 而不是 foreach。 您将在 w3school 中找到 ng-repeat 示例和语法。

    【讨论】:

    • 我没有使用 AngularJs,所以我无法使用 ng-repeat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多