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 配列である buttons というプロパティがあることがわかります

私の見解では、各ゾーンをループしてボタンを出力しますが、私のゾーンの 1 つにはボタンが含まれておらず、この例外がスローされます。

エラー: バインディングを解析できません。メッセージ: 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>

私の質問は次のとおりです。ループを開始する前に、監視可能な配列の null 値をどのようにチェックしますか?

さらに、button.Name などの単一のプロパティで null 値をチェックして、ボタンに名前がある場合は div に書き込み、ない場合は何も書き出さないようにします (またはデフォルトのテキスト)。

したがって、基本的にはビュー内のビューモデル プロパティを null チェックするため、この例外は発生しません。

ありがとう

4

1 に答える 1

1

私の質問は次のとおりです。ループを開始する前に、監視可能な配列の null 値をどのようにチェックしますか?

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 に答える