2

所以我有一个看起来像这样的viewModel

self.zones = ko.observableArray(zones);

   ko.utils.arrayForEach(self.zones(), function (zone) {


        //Get all rooms for the zone
        zone.rooms = getChildren("Organization", "Organization", zone.ID);


        if (zone.rooms.length > 0) {

            zone.buttons = ko.observableArray([]);

            //For each Room in Zone find the Buttons and add them to the Zone.buttons ObservableArray 
            ko.utils.arrayForEach(zone.rooms, function (room) {
                room.buttons = getChildren("Organization", "ButtonAssign", room.ID, { scheduleID: self.scheduleID });

                ko.utils.arrayForEach(room.buttons, function (button) {
                                           zone.buttons.push(button);
                });
            });

        }

所以你可以看到一个区域有一个叫做按钮的属性,它是一个 Observable 数组

在我看来,我遍历每个区域并输出按钮,但我的一个区域不包含任何按钮并引发此异常:

错误:无法解析绑定。消息:ReferenceError:未定义按钮;绑定值:foreach:buttons

       <table>
        <tbody>
            <tr data-bind="foreach: zones" style="vertical-align: top;">
                                        <div class="zoneDiv">
                        <span data-bind="text: Name"></span>
                        <div data-bind="foreach:buttons" class="buttonsList">
                            <div class="buttonField">
                            <div data-bind="text: Name" style="float: left; width: 140px;">
                                    </div>


                                </div>
                                <input type="hidden" data-bind="value: ID" />


                        </div>
                    </div>
                </td>
            </tr>
        </tbody>
    </table>

所以我的问题是:在开始循环之前如何检查可观察数组中的空值?

此外,您如何检查单个属性(例如 button.Name)上的空值,以便如果按钮有名称,我会将其写在 div 中,如果没有,我不会写出任何内容(或默认文本)。

所以基本上对视图中的视图模型属性进行空检查,所以我不会得到这个异常

谢谢

4

1 回答 1

1

所以我的问题是:在开始循环之前如何检查可观察数组中的空值?

使用if绑定: http: //knockoutjs.com/documentation/if-binding.html

但是对于您的代码,为什么不设置一个空的 observableArray,这样您就不需要引入任何条件:

self.zones = ko.observableArray(zones);

ko.utils.arrayForEach(self.zones(), function (zone) {

    zone.rooms = getChildren("Organization", "Organization", zone.ID);
    zone.buttons = ko.observableArray([]);

    if (zone.rooms.length > 0) {

        //For each Room in Zone find the Buttons and add them to the Zone.buttons ObservableArray 
        ko.utils.arrayForEach(zone.rooms, function (room) {
            room.buttons = getChildren("Organization", "ButtonAssign", room.ID, { scheduleID: self.scheduleID });

            ko.utils.arrayForEach(room.buttons, function (button) {
                zone.buttons.push(button);
            });
        });

    }
});
于 2013-01-18T16:38:07.983 回答