Javascript 在一个可观测的轨道上计算

Javascript 在一个可观测的轨道上计算,javascript,knockout.js,Javascript,Knockout.js,我试着用一个计算机来计算一些产品的总量 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

我试着用一个计算机来计算一些产品的总量

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_unitario
cantidad
发生变化时<代码>总计不更新

function productModel(data)
{
    var self=this;
    ...
    self.total=ko.computed(function()
        {
            return self.precio_unitario()*self.cantidad(); 
        },this); 
}
您应该将ko.computed绑定到
this
而不是绑定到函数。您希望它绑定到创建的对象,而不是构造函数,因为构造函数上没有这些属性。由于您使用的是self,因此默认情况下会处理这个问题,如果您愿意,可以完全忽略第二个参数

在构造函数中,
this
self
将引用使用
new
运算符时创建的对象。因此,将在该对象上创建所有属性

您应该将ko.computed绑定到
this
而不是绑定到函数。您希望它绑定到创建的对象,而不是构造函数,因为构造函数上没有这些属性。由于您使用的是self,因此默认情况下会处理这个问题,如果您愿意,可以完全忽略第二个参数


在构造函数中,
this
self
将引用使用
new
运算符时创建的对象。因此,将在该对象上创建所有属性

self=this应该是
var self=this;否则您将覆盖全局
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.catiad(newValue)和非
self.catidad=newValue
self=this应该是
var self=this;否则您将覆盖全局
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

+1,但是因为他已经在
self
中存储了对
这个
的引用,所以有必要绑定吗?@Robbie good call。我只是看到绑定了错误的东西,我想我应该用正确的东西替换它,但完全删除它应该是正确的fine@kadosh如果仍然存在问题,可能是绑定问题,而不是视图模型设置问题。是否确定视图模型组件实际上正在更改,并且已正确绑定到“总计”?像这样的嵌套内容在绑定时可能会变得很棘手(尽管看起来你的评论现在不见了。解决了?+1,但是因为他已经在
self
中存储了对
这个
的引用,有必要绑定吗?@Robbie good call。我只是看到绑定了错误的东西,我想我应该用正确的东西替换它,但完全删除它应该是正确的fine@kadosh如果仍然存在问题,可能是绑定问题,而不是视图模型设置问题。是否确定视图模型组件实际上正在更改,并且已正确绑定到“总计”?像这样的嵌套内容在绑定时可能会变得很棘手(尽管看起来您的评论现在不见了。解决了吗?)。顺便说一句,当你有
var self=that=this
,您正在设置一个全局
,该
。很好的一点,我应该对此进行评论,但对于Kadosh来说,这更像是一个简短的视觉效果。在其他区块中有更多的细微差别,但我希望他能理解发生了什么。顺便说一句,当你有
var self=that=this
,您正在设置一个全局
,该
。很好的一点,我应该对此进行评论,但对于Kadosh来说,这更像是一个简短的视觉效果。其他区块中出现了更多细微差别,但我希望他能理解发生了什么