2

マッピングプラグインを使用するKnockoutViewmodelがあります。JSONオブジェクトをマッピングした後、次のような計算値を作成します。

/* viewmodel setup and mapping */

myViewModel
    .formattedGiftAmount = ko.computed({
        read: function () {
            return parseInt(this.giftAmount(), 10).formatMoney();                        
        }
        , write: function (value) {                        
            this.giftAmount(value.unformatMoney());
        }
        , owner: this        
    })
    .formattedGoal = ko.computed({
        read: function () {
            return parseInt(this.goalAmount(), 10).formatMoney();                        
        }
        , write: function (value) {                        
            this.goalAmount(value.unformatMoney());
        }
        , owner: this        
});

コードが何をするかについてはそれほど心配しないでください。私はパターンにもっと関心があります。ご覧のとおり、2つのプロパティformattedGiftAmount()formattedGoal()は、それらを定義するほぼ同一のオブジェクトがあります。唯一の違いは、変更するプロパティです。このようなインスタンスがさらに増える可能性があるので、これをより再利用可能にする方法があるかどうか疑問に思いました。のようなことを想像することはthis[prop]()できますが、それをオブジェクトに注入して機能させる方法を完全に理解することはできません。

PS:私はこれを見ましたが、それでも私が探しているものを完全には実行しません。

4

2 に答える 2

7

fnを変更して、ko.observableに関数を追加して作成することもできます。これにより、コンストラクターにプロパティを説明的な方法で追加できます(fiddle

ko.observable.fn.formatAsMoney = function() {
    var base = this;
    return ko.computed({
        read: function() {
            return formatMoney(parseFloat(base()));
        },
        write: function(newValue) {
            base(unformatMoney(newValue));
        }
    });
};

function ViewModel() {
    var self = this;
    self.number = ko.observable(10.5);
    self.money = self.number.formatAsMoney();
};
于 2012-05-30T08:43:45.847 に答える
2

フォーマットされていないプロパティに基づいてフォーマットされたプロパティを作成する関数をビューモデルに追加できます。

myViewModel.addFormattedProperty = function(formattedName, unformattedName) {
    this[formattedName] = ko.computed({
        read: function() {
            return parseInt(this[unformattedName](), 10).formatMoney();                        
        },
        write: function(value) {
            this[unformattedName](value.unformatMoney());

        },
        owner: this
    });
};

次に、プロパティに対してそれを呼び出すことができます。

myViewModel.addFormattedProperty('formattedGiftAmount', 'giftAmount');
myViewModel.addFormattedProperty('formattedGoalAmount', 'goalAmount');
于 2012-05-29T23:25:32.763 に答える