1

UI の html フィールドにバインドされた監視可能な配列があります。

ただし、UI 上のこれらのフィールドへの変更はビューモデルには反映されません。これは、Knockout のドキュメントによると、observableArray は、それらのオブジェクトの状態ではなく、配列内にあるオブジェクトを追跡するためです。

コードは次のようになります。

var RewardMissionModel = function () {
    var self = this;
    self.achievementID = ko.observable();
    self.rewardAsset = ko.observable();
    self.rewards = ko.observableArray([new Reward("Points", "Qty", "", "Item", "")]);

    self.isDirty = false;

    //Add reward
    self.addReward = function () {
        //var self = this;
        var tempRewardType = "Points";
        self.rewards.push(new Reward(tempRewardType, "Qty", "", "Item", "", 0));
    };

    //Remove reward
    self.removeReward = function (reward) {
        if (self.rewards().length > 1)
            self.rewards.remove(reward);
    };
    //------------------------------------------------------------------------------
};

function Reward(rewardType, quantityLabel, rewardQuantity, itemLabel, item, itemID) {
    var self = this;
    //self.viewModel = viewModel;
    self.rewardTypes = ["Points", "Coins", "Items"];    
    self.rewardType = ko.observable(rewardType);
    self.itemLabel = ko.observable(itemLabel);
    self.itemText = ko.observable(item);
    self.quantityLabel = ko.observable(quantityLabel);
    self.rewardQuantity = ko.observable(rewardQuantity);
    this.selectedRewardType = ko.observable(rewardType);
    self.isItemType = function (selectedRewardType) {
        return selectedRewardType === this.selectedRewardType();
    }

    self.itemID = ko.observable(itemID);

}

HTML コード:

<div data-bind="template: { name: 'rewards-template', foreach: rewards }"></div>
                <script type="text/html" id="rewards-template">
                    <span style="margin-left:30px">Reward Type</span>
                    <select class="dropdown" data-bind="options: rewardTypes, value: selectedRewardType"></select>
                    <span data-bind="text: itemLabel, visible: isItemType('Items')"></span>

オブジェクトをオブザーバブル配列に追加または削除するとビューモデルのダーティ フラグが設定されますが、UI で変更すると考慮されません。

アプローチの 1 つは、オブザーバブル内に通常の配列を配置することです。

これまたはより良いアプローチを示すコード例はありますか?

助けてください。

4

2 に答える 2

0
function MyObject(val1, val2)
{
   this.firstProperty = ko.observable(val1);  
   this.secondProperty = ko.observable(val1);
}  

var myViewModel = new function()  
{  
   var self = this;
   self.values = ko.observableArray([]);  
   self.values.push(new MyObject("value11", "value12"));  
   self.values.push(new MyObject("value21", "value22"));
}
于 2013-04-01T12:06:54.267 に答える