Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?

Posted

技术标签:

【中文标题】Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?【英文标题】:Knockout.js - How to display a list of items 2 different ways using 'foreach'? 【发布时间】:2012-02-01 00:54:34 【问题描述】:

编辑

我制作了一个屏幕截图,以更好地展示我正在尝试做的事情以及我遇到的问题:

我正在使用 Knockout 创建一个 Room 对象列表。我有在添加新房间时显示房间表的代码 - 使用data-bind="foreach: rooms"。房间添加了一个 JQuery UI 模式弹出窗口,该弹出窗口显示一个简单地询问房间“名称”的表单。

这很好用 - 但我还需要在表格列表下方显示每个房间的图形表示 - 只需使用 css 类为房间提供标准宽度、高度和颜色。

这是整个 javascript 代码:

$(function()

    function Room(data) 
        this.name = ko.observable(data.name);

       


    function RoomViewModel() 
        var self = this;
        self.rooms = ko.observableArray([]);
        self.newRoomText = ko.observable();


        $("#hidden-button").click(function(e)          
            e.preventDefault();         
        )

        self.addRoom = function() 
            self.rooms.push(new Room( name: this.newRoomText() ));
            self.newRoomText("");       
            $("#modal").dialog("close");        
        

        self.removeRoom = function(room) 
            self.rooms.remove(room)
        

        self.RoomModal = function()    

            $("#button-add-room").attr("disabled", "disabled"); 

            $("#input-room-name").keypress(function(e) 
                if($(this).val() != '') 
                    $("#button-add-room").removeAttr("disabled");   

                 else 
                    $("#button-add-room").attr("disabled", false);
                           
            )

            $("#modal").dialog(
                height: 400,
                width: 400,
                modal: true
            );
        

    

    ko.applyBindings(new RoomViewModel());

);

当我在包含表格的容器下方添加容器时,应用会忽略“self.addRoom”函数中的一些代码。它会将房间添加到列表中,但模式窗口将不再关闭 - 使用$("#modal").dialog("close");。它还会忽略 self.newRoomText(""); 代码,该代码会清除输入值以使其为新房间做好准备。

<!--******* Rooms List **********-->
        <div id="room-list-view">
            <table>
                <tbody data-bind="foreach: rooms">
                    <tr>
                        <td data-bind="text: name"></td>
                        <td><a href="#" data-bind="click: $parent.removeRoom">Delete</a></td>
                    </tr>
                </tbody>
            </table>
        </div>

        <!-- IF I COMMENT THIS PART OUT, IT WORKS JUST FINE -->
         <div id="graphical-room-view">
            <ul data-bind="foreach: rooms">
                <li class="graphical-room" data-bind="text: room"></li>
            </ul>

        </div> 

如您所见,如果我用 id="graphical-room-view" 注释掉 div,应用程序就可以正常工作。

是否可以在我的视图中的两个不同位置对同一个数组使用 foreach 绑定?我是不是走错路了——我应该有第二个 ViewModel 吗?

【问题讨论】:

【参考方案1】:

在您的第二个foreach 中,您使用的不是text: name,而是text: room。可能是问题;-)

【讨论】:

天啊——你是世上最聪明的人!!!现在一切都正常了——令人惊讶的是,一个简单的错误可以打破多少垃圾。 有时让其他人查看您的代码会有所帮助;-)

以上是关于Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?的主要内容,如果未能解决你的问题,请参考以下文章

Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?

knockout.js入门

如何有条件地绑定到 knockout.js 中的“valueUpdate”?

如何将 knockout.js 与 ASP.NET MVC ViewModels 一起使用?

Knockout.JS如何绑定dom元素绑定

如何使用 Knockout.js 在特定位置将项目添加/插入到 ObservableArray