【问题标题】:KnockoutJS help me when i change value input, list item had init not change value当我更改值输入时,KnockoutJS 帮助我,列表项初始化不更改值
【发布时间】:2014-09-05 18:46:01
【问题描述】:

我有一个包含产品列表 {Name,Quatity,Price,Total} 的网格。我用值 0 初始化 <input id='Price'>, 当更改一个产品的数量时,自动计算的总计 = 数量 * 价格,Price = $('#Price').val()

如果网格初始化为空,我可以正常工作,但是当我使用某些产品初始化网格并将 <input id='Price'> 设置为 0 时,计算不起作用。

我想在我更改 <input id='Price'> 时自动计算 这是我在 jsfiddle 中的示例,但它不起作用。 http://jsfiddle.net/bd0ktx5r/5/

【问题讨论】:

  • 我想如果您将 Price 作为 ViewModel 中的可观察对象并从中获取价值会更好。
  • 我只是在jsfiddle中修复了demo,你可以再试一次,我希望Price是一个文本输入,当它改变时,所有的总将重新计算
  • 你可以在这里试试:jsfiddle.net/bd0ktx5r/5

标签: jquery knockout.js


【解决方案1】:

这是你想要的吗? http://jsfiddle.net/bd0ktx5r/9/

我改了一堆东西,因为一开始我找不到错误,但是当我打开控制台时,我意识到有很多语法错误等等。

我更改的主要内容是价格的输入字段:我将其绑定到添加到视图模型中的可观察对象,以便您的计算可以响应其中的更改。为此,必须将 price-observable 传递给 Product 的构造函数。

我还对您的代码进行了一些清理,希望使其更具可读性和更易于理解。

问题是 ko.computed 只响应它使用的 observables 的变化(依赖)。因为您使用 jQuery 从输入字段中获取值,所以 ko.computed 无法知道价格何时发生变化。避免这些错误的最佳方法是始终使用敲除,而不是将其与 jQuery 混合来获取或设置值。

有趣的代码:

var Product = function (product, priceObservable)
{
    var self = this;
    // omitted code
    self.Total = ko.computed(function () {
        // Here I use the observable passed into the function
        return priceObservable() === 0 ? 0 : (priceObservable() * self.Quatity()).toFixed(2);
    });
};

var ProductModel = function (json) {
    var self = this;
    self.price = ko.observable(3000); // 3000 can be any initial value
    self.products = ko.observableArray(json.map(function (item) {
        return new Product(item, self.price);
    }));
};

var productViewModel = new ProductModel(json);
ko.applyBindings(productViewModel);

<input type="text" data-bind="value: price, valueUpdate: 'afterkeydown'" />

【讨论】:

  • 我在这里尝试,但是当更改价格 = 2000 并添加新产品时,旧产品列表仍然计算价格 =3000 jsfiddle.net/bd0ktx5r/8
  • 当我更改值输入文本时,如何更改所有产品的总和
  • 你把它改回了 jQuery,所以现在它不再工作了。这正是我所说的:不要使用 jQuery 来读取值 :) 我给出的答案使用价格字段的可观察值,它就像你说的那样工作。
  • self.price = ko.observable(value text box change); not self.price = ko.observable(3000);,可以通过Knockout获取值文本框变化
  • 获得ko.observable(value text box change) 的方式是通过HTML 中的绑定:&lt;input type="text" data-bind="value: price, valueUpdate: 'afterkeydown'" /&gt;。此外,您的 ko.applyBindings 现在需要应用于整个页面:ko.applyBindings(productViewModel);。请再看一下我的例子,它做了所有这些,甚至更多。 3000 只是我设置的初始值,可以是任何你想要的(或什么都不是)。
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多