1

計算を使用して、製品の合計を計算しようとしています。

function productViewModel(){

    self = this;
    function productModel(data)
    {
        var self=this;
        self.id=ko.observable(data.id);
        self.codigo=ko.observable(data.codigo);
        self.recurso=ko.observable(data.recurso);
        self.unidad=ko.observable(data.unidad);
        self.precio_unitario=ko.observable(0);
        self.cantidad=ko.observable(0);
        self.total=ko.computed(function()
            {
                return self.precio_unitario()*self.cantidad(); 
            },productModel); 
    }

    self.products = ko.observableArray([]);

    self.addProduct = function(product)
    {
        self.products.push(new productModel(product));
    };
    self.removeProduct = function()
    {
        self.products.remove(this);
    };

}

orden = new productViewModel()
ko.applyBindings(orden);

しかし、いつprecio_unitariocantidadが変更されます。total更新しません。

4

2 に答える 2

3
function productModel(data)
{
    var self=this;
    ...
    self.total=ko.computed(function()
        {
            return self.precio_unitario()*self.cantidad(); 
        },this); 
}

ko.computed を関数ではなくバインドする必要がthisあります。これらのプロパティを持たないコンストラクターではなく、作成されたオブジェクトにバインドする必要があります。self を使用しているため、これは実際にはデフォルトで処理されます。必要に応じて、2 番目の引数を完全に省略できます。

コンストラクタ関数内で、thisまたは演算子selfを使用したときに作成されるオブジェクトを参照します。newそのため、すべてのプロパティがそのオブジェクトに作成されます。

于 2013-03-07T01:58:28.417 に答える
2

self = this;する必要がありvar self = this;ます。それ以外の場合は、 global を上書きしていますself,productModelまた、計算されたものを取り出します。それは必要はありません。

重要な部分:

function productViewModel() {
    var self = this;

    function productModel(data) {
        var self = this;
        ...
        self.total = ko.computed(function() {
            return self.precio_unitario()*self.cantidad(); 
        });
    }
    ...
}

また、オブザーバブルへの書き込みに常に正しい形式を使用していることを確認することも重要です。あるべきでありself.catidad(newValue);、そうではないself.catidad = newValue;

于 2013-03-07T02:27:11.567 に答える