计算敲除的循环依赖性

2023-11-27

请参阅工作 jsFiddle:http://jsfiddle.net/ruslans/vFK82/

我有 3 个字段:净价(不含税)、税额和总价(价格不含增值税 + 税额)。 NetPrice 和 Total 是可写的,即您可以更改其中任何一个,而其他 2 个值必须自动计算。

我的方法是使用 3 个可观察对象和 2 个计算淘汰对象,但我想也许更了解淘汰赛的人可以建议一种更有效的方法来实现这一目标。

html:

Net Price:
<input type="textbox" data-bind="value: NetPriceCalc" />
<br />Tax Amount:
<label data-bind="html: TaxAmt"></label>
<br />Total:
<input type="textbox" data-bind="value: TotalCalc" />

script:

var viewModel = {
    NetPrice: ko.observable(100),
    TaxAmt: ko.observable(20),
    Total: ko.observable(120),
    TaxRate: 0.2
};

viewModel.updateTaxAmt = function (useNetPrice) {
    if (useNetPrice) {
        return this.TaxAmt(this.NetPrice() * this.TaxRate);
    } else {
        var total = Number(this.Total());
        var taxAmt = total - total / (1 + this.TaxRate);
        return this.TaxAmt(taxAmt);
    }
};
viewModel.updateNetPrice = function () {
    this.NetPrice(Number(this.Total()) - Number(this.TaxAmt()));
};
viewModel.updateTotal = function () {
    this.Total(Number(this.NetPrice()) + Number(this.TaxAmt()));
};

viewModel.NetPriceCalc = ko.computed({
    read: function () {
        console.log("NetPriceCalc read");
        return viewModel.NetPrice();
    },
    write: function (value) {
        console.log("NetPriceCalc write");
        viewModel.NetPrice(value);
        viewModel.updateTaxAmt(true);
        return viewModel.updateTotal();
    }
});
viewModel.TotalCalc = ko.computed({
    read: function () {
        console.log("TotalCalc read");
        return viewModel.Total();
    },
    write: function (value) {
        console.log("TotalCalc write");
        viewModel.Total(value);
        viewModel.updateTaxAmt(false);
        return viewModel.updateNetPrice();
    }
});

ko.applyBindings(viewModel);

对OP的一些评论:

  • 你不需要return中的条款write的方法ko.computed.
  • 您的方法使用Number()在多个地方运行,您可能希望更改它以获得特定的精度(或用于验证用户输入的某个集中位置)。所以你可以使用ko.扩展器来改善这一点。我特别推荐 ko 团队已经制作的扩展器,名为ko.extenders.numeric.
  • 你的方法还使用console.log()在几个地方,你可能想使用 ko 团队制作的另一个 ko.extenderko.extenders.logChange.
  • 代替ko.computed在这种情况下我认为最好使用subscribe因为它需要更少的代码(并且可能更快)。

我的方法是这样的:

function viewModel() {
    this.TaxRate = 0.2;
    this.NetPrice = ko.observable().extend({ numeric: 2, logChange: "NetPrice"  });
    this.TaxAmt = ko.observable().extend({ numeric: 2, logChange: "TaxAmt"  });
    this.Total = ko.observable().extend({ numeric: 2, logChange: "Total"  });

    this.NetPrice.subscribe(function (newNetPrice) {
        this.TaxAmt(newNetPrice * this.TaxRate);
        this.Total(newNetPrice + this.TaxAmt());
    }, this);
    this.Total.subscribe(function (newTotal) {
        this.TaxAmt(newTotal - newTotal / (1 + this.TaxRate));
        this.NetPrice(newTotal - this.TaxAmt());
    }, this);

    this.NetPrice(100);
}

// then I have the extenders code copied exactly as seen in: http://knockoutjs.com/documentation/extenders.html)
ko.extenders.numeric = ...
ko.extenders.logChange = ... 

// and finally init everything as usual
ko.applyBindings(new viewModel());

您可以在这里看到工作小提琴:http://jsfiddle.net/protron/JFPgu/2/

请注意,此解决方案中的数字永远不会比数字扩展器上指定的小数位数更多(即使用户输入的值也会自动固定为所需的精度)。

将我的答案与 gaurav 当前接受的答案进行比较(这也非常好且简单):我认为我的方法的主要优点是它可以让您使用这些很棒的扩展器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算敲除的循环依赖性 的相关文章

  • 声明为对象文字与函数的剔除视图模型之间的区别

    在knockout js中 我看到视图模型声明为 var viewModel firstname ko observable Bob ko applyBindings viewModel or var viewModel function
  • 检测单选按钮/复选框状态的变化

    我需要可靠地检测页面上单选按钮 复选框的状态变化 以便查看表单是否被修改 现在 这是一个完全独立的脚本 我无法修改任何控制表单的内容 目前 我只能看到两种方法 onchange事件处理程序 有助于处理文本框 文本区域和选择 但不会针对复选框
  • 在 Node.js 中生成带条形码的 pdf

    我在用https github com devongovett pdfkit https github com devongovett pdfkit生成 PDF 文件 我可以简单地使用类似的方法 app get get pdf req re
  • 为什么省略分号会破坏这段代码?

    或者换句话说 为什么分号插入失败 导致下面的代码被破坏 function Foo Foo prototype bar function console log bar lt missing semicolon function Foo pr
  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • 在上传之前预览图像 VUEjs [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但我不知道如何在vuejs中使用代码 我尝试了很多但没有任何结果 我还添加了我的代码 有人可以帮帮我吗 这是我的代码 谢谢 html
  • 检测 Webkit/Chrome 中 HTML5 数字控件更改的事件?

    HTML5 为我们提供了一些新的输入元素 例如
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • 设计邀请批量邀请 - Ruby on Rails

    我正在尝试使用 Devise invitable 来一次添加多个用户 基本上 当有人创建帐户时 他们要做的第一件事就是使用可邀请的表单添加一堆用户 只是不确定如何复制表单中的字段并让他们为每个条目发送创建请求 提前致谢 我就是这样做的 提供
  • GROUP BY 由间隙分隔的连续日期

    假设你 在 Postgres 9 1 中 有一个像这样的表 date value 其中有一些间隙 我的意思是 并非 min date 和 max date 之间的每个可能日期都有它的行 我的问题是如何聚合这些数据 以便单独处理每个一致的组
  • 在基于 Debian 的系统上如何找到字体所对应的 Unicode 代码点?

    从基于 Debian 的系统上的脚本语言 例如 Python 或 Ruby 我想找到以下之一 特定字体具有字形的所有 Unicode 代码点 具有特定 Unicode 代码点字形的所有字体 显然 1 或 2 可以从另一个派生 所以无论哪个更
  • 从 C# 中的 List 中删除重复项

    有人有一种在 C 中对通用列表进行重复数据删除的快速方法吗 如果您使用 Net 3 则可以使用 Linq List
  • 如何在 JavaScript 中处理 ctrl+arrow ?

    I ve noticed an problem when trying to catch keyboard shortcut CTRL an arrow I ve handled keydown event Now when I hold
  • 拼接微芯片的显微镜图像

    因此 我正在尝试拼接微芯片显微镜拍摄的图像 但很难将所有特征对齐 我已经在两个相邻图像之间有 50 的重叠 但即使如此 它也并不总是很合适 我使用 SURF 和 OpenCV 来提取关键点并找到单应矩阵 但尽管如此 这还远远不是一个可以接受
  • 如何在我的 iPhone 应用程序中包含字体?

    我已经看过这个帖子了 我可以在 iPhone 应用程序中嵌入自定义字体吗 这很有帮助 但我想简单地通过以下方式加载字体 UIFont font UIFont fontWithName Harrowprint size 20 有些人报告说这是
  • 为什么在 JavaScript 中,'3 instanceof Number' == false,但 '3..method()' 会调用 Number.prototype.method?

    鉴于字面数字严格来说不是一个实例Number 为什么我可以调用原型方法Number or String or Boolean 对应文字对象上的对象 这是跨浏览器的标准行为吗 当这种情况发生时到底发生了什么 我怀疑它在调用方法之前将文字强制转
  • 如何多次执行存储过程

    我有一个存储过程 我像这样执行 exec sp storedProc 123 ME 333 NULL 我需要指定 400 个不同的值 如何同时执行具有不同值的存储过程 您可以尝试使用 CURSORS 来完成此操作 DECLARE param
  • 如何从Instagram公共访问API获取视频?

    我知道这个 api 可以获取图像 但是视频呢 https www instagram com username a 1 我能够获取视频的缩略图 但无法获取源或网址本身 当您进行上述 API 调用时 它将返回code在里面 看起来像这样 BW
  • 鼠标移动时淡入

    如何使用 JavaScript 在第一次鼠标移动时淡入 div 内容 例如在 google com 上 我不想让它再次消失 Code 查看实际效果 attach event handler document body onmousemove
  • 使用configurationmanager从多个web.config文件中读取

    背景 我有一些数据存储在大约 100 个 Web 应用程序的 web config 文件中 这些数据正在逐渐转移到数据库中 网页将显示 web config 数据 直到有人单击 编辑 链接 在这种情况下 他们将被重定向到一个网页 该网页将允
  • System.ArgumentException:复杂 DataBinding 接受 IList 或 IListSource 作为数据源

    我使用下面的 C 代码来填充 WinForms 列表框 但是我想隐藏所有系统文件夹 例如 RecyclingBin 但它给了我以下错误 System ArgumentException 复杂 DataBinding 接受 IList 或 I
  • 使用 vba 取消选择数据透视表中的所有项目

    有人可以快速解释如何取消选择新创建的数据透视表中的所有项目 以便我可以返回并仅选择一个或两个项目吗 我尝试了以下方法 PivotItems Select All Visible False Thanks 这可能是最接近您想要的 Dim i
  • 在 node.js 中运行 .wasm 文件

    我读过很多关于在 Node js 中运行 wasm 文件的文章 每当我测试代码时 它都会抛出此错误 TypeError WebAssembly instantiate Import 0 module wasi snapshot previe
  • 使用自动布局删除并重新添加子视图

    使用自动布局时 我的理解是删除子视图 当然同时保留对它的引用 删除的子视图仍然知道其自动布局约束 但是 当稍后将其添加回超级视图时 子视图不再知道其帧大小 相反 它似乎得到了零帧 我假设自动布局会自动调整其大小以满足约束 难道不是这样吗 我
  • 使用 Moq 验证私有方法的执行

    我想测试以下逻辑 这显然是我的方法的精简版本 public void myPublicMethod params if some condition privateMethod1 else privateMethod2 我模拟了该方法中的所
  • 枚举成员可以是 ANSI-C 中数组的大小吗?

    我需要根据有多少个元素来分配一个数组enum有 我做了以下事情 enum A B C LAST char buf LAST 效果很好 即使是 ansi pedantic旗帜 但我不确定它是否是 GCC 或 clang 支持大多数 如果不是全
  • 如何在Powershell中搜索多个文件中的字符串并返回文件名?

    几天前我开始学习 powershell 我在谷歌上找不到任何可以满足我需要的东西 所以请忍受我的问题 我被要求将一些文本字符串替换为多个文件 我不一定知道可能的目标文件的扩展名 也不知道它们的位置 到目前为止 我已经成功地递归浏览到目录 g
  • 计算敲除的循环依赖性

    请参阅工作 jsFiddle http jsfiddle net ruslans vFK82 我有 3 个字段 净价 不含税 税额和总价 价格不含增值税 税额 NetPrice 和 Total 是可写的 即您可以更改其中任何一个 而其他 2