1

次の観測可能な配列があります。

self.Profiles =ko.observableArray( ko.utils.arrayMap(initialData, function (profile) {
                return {
                    StartDate : formatDateOnly(profile.StartDate),
                    EndDate : formatDateOnly(profile.EndDate),
                    ProfileID :profile.ID,
                    ProfileName : profile.Name,
                    ProjectName : profile.ProjectName,
                    ReadingListID : profile.ReadingListID,
                    ReadingListName : profile.ReadingListName

                };
            }));

ドロップダウンをプロファイルにバインドしてプロファイル名を表示したいのですが、ドロップダウンの値が変更された場合は、選択したプロファイル ID に対応する新しい値でスパン要素を更新したいと考えています。

<table id="readingListApplyToProfile" class="fullWidthTable">
        <tr>
            <td>
                Profile:
            </td>
            <td>
                <select id="cboProfile" name="cboProfile" data-bind="options: Profiles, optionsText: 'ProfileName', 'optionsCaption': 'Select profile...', optionsValue:'ProfileID'"></select>
            </td>
        </tr>
        <tr>
            <td>
                End Date:
            </td>
            <td>
                <span data-bind="'text':EndDate"></span>
            </td>
        </tr>
    </table>

スパン要素がドロップダウン値を認識していないため、スパンを更新できません。誰か助けてください。私は完全に迷っています。

4

2 に答える 2

3

あなたが見逃しているのは、ドロップダウンリストの値バインディングです。ここに私が作成したフィドルがあります。

http://jsfiddle.net/sujesharukil/sBZvb/1/

<select id="cboProfile" name="cboProfile" data-bind="options: Profiles, optionsText: 'ProfileName', 'optionsCaption': 'Select profile...', optionsValue:'ProfileID', value: selectedProfileId ">

そして、ここにビューモデルがあります

var myViewModel = function()
{
    var self = this;
        this.Profiles =ko.observableArray([{
                    StartDate : '02/01/2012',
                    EndDate : '01/01/2013',
                    ProfileID :10,
                    ProfileName : 'Some Name',
                    ProjectName : 'Some Project',
                    ReadingListID : 100,
                    ReadingListName : 'Some List',
                },
                {
                    StartDate : '12/01/2012',
                    EndDate : '02/27/2013',
                    ProfileID :12,
                    ProfileName : 'New Name',
                    ProjectName : 'New Project',
                    ReadingListID : 200,
                }]);
    this.selectedProfileId = ko.observable({}); //this stores the selected id

}

ko.applyBindings(new myViewModel());

それが役立つことを願っています。

スジ

于 2013-03-20T13:30:15.350 に答える
2

私は、ProfileID を受け取り、その ID に対応する Profile を出力し、出力されたオブジェクトのさまざまなプロパティにスパンをバインドする、computerObservable のアイデアを思いつきました。驚いたことに、それはうまくいきました。モデルが非常に似ているように、Sujesh Arukil のフィドルをいじって自分のアイデアを試していました。

複数のスパンを示す実例: http://jsfiddle.net/jonhopkins/fgZNQ/2/

モデル:

var myViewModel = function()
{
    var self = this;
        self.Profiles =ko.observableArray([{
                    StartDate : '02/01/2012',
                    EndDate : '01/01/2013',
                    ProfileID :10,
                    ProfileName : 'Some Name',
                    ProjectName : 'Some Project',
                    ReadingListID : 100,
                    ReadingListName : 'Some List',
                },
                {
                    StartDate : '12/01/2012',
                    EndDate : '02/27/2013',
                    ProfileID :12,
                    ProfileName : 'New Name',
                    ProjectName : 'New Project',
                    ReadingListID : 200,
                }]);

    self.selectedProfileId = ko.observable();

    self.getProfile = ko.computed({
        read: function() {
            for (var i = 0; i < self.Profiles().length; i++) {
                if (self.Profiles()[i].ProfileID == self.selectedProfileId()) {
                    return self.Profiles()[i];
                }
            }
            // in case there was no match, output a blank Profile
            return [{
                    StartDate : '',
                    EndDate : '',
                    ProfileID : '',
                    ProfileName : '',
                    ProjectName : '',
                    ReadingListID : '',
                    ReadingListName : ''
            }];
        },
        write: function(value) {
            self.selectedProfileId(value);
        },
        owner: self
    });
}

ko.applyBindings(new myViewModel());

編集: Sujesh は、computedObservable のより優れたバージョンを提案しました。

self.getProfile = ko.computed(function(){
    var profile = ko.utils.arrayFirst(self.Profiles(), function(prof){
        return prof.ProfileID == self.selectedProfileId();
    });

    return profile || {};
});

HTML:

<table id="readingListApplyToProfile" class="fullWidthTable">
    <tr>
        <td>
            Profile:
        </td>
        <td>
            <select id="cboProfile" name="cboProfile" data-bind="options: Profiles, optionsText: 'ProfileName', 'optionsCaption': 'Select profile...', optionsValue:'ProfileID', value: getProfile "></select>
        </td>
    </tr>
    <tr>
        <td>
            End Date:
        </td>
        <td>
            <span data-bind="text: getProfile().ProfileName"></span>
        </td>
    </tr>
</table>
于 2013-03-20T13:55:58.493 に答える