AngularJs $ watch监视和更新vise versa变量

时间:2017-01-07 17:35:30

标签: javascript angularjs

我有一个表格,其中有2个文字输入

  1. 折扣%
  2. 折扣金额
  3. 方案

    discount %更改后,Discount Amount应更改并且 在discount amount更改后,discount %应更改

    我知道问题听起来很愚蠢,但我无法使用$watch执行此任务,如下面的代码所示。

    $scope.$watch(function () {
        return vm.orderDetails.discountPer;
    }, function (newV, oldV) {
        vm.orderDetails.discountAmount = (newV / 100 * vm.orderDetails.totalPurcasePrice).toFixed(2);
    
        vm.totalOrderPrice();
    });
    $scope.$watch(function () {
        return vm.orderDetails.discountAmount;
    }, function (newV, oldV) {
        vm.orderDetails.discountPer = (newV / vm.orderDetails.totalPurcasePrice * 100).toFixed(2);
    
        vm.totalOrderPrice();
    });
    

    但是,我能够找到一个糟糕的解决方法,我正在监视两个输入的文本更改并使用布尔标志valueChanging我能够完成我的任务但我对此不满意。请建议如果你有更好的解决方案。

2 个答案:

答案 0 :(得分:0)

一种工作方式是指定您想要观看的字符串,如下所示:

$scope.$watch('vm.orderDetails.discountPer', function (newV, oldV) {
    vm.orderDetails.discountAmount = (newV / 100 * vm.orderDetails.totalPurcasePrice).toFixed(2);
    vm.totalOrderPrice();
});
$scope.$watch('vm.orderDetails.discountAmount', function (newV, oldV) {
    vm.orderDetails.discountPer = (newV / vm.orderDetails.totalPurcasePrice * 100).toFixed(2);

    vm.totalOrderPrice();
});

如果您想观看完整的物体,可以使用手表

$scope.$watch('vm.orderDetails', function (newV, oldV) {
    //Update what you need...
}, true);

注意:最后的true告诉$ watch比较对象中的值而不是引用

答案 1 :(得分:0)

通常数据更改有两个原因:用户操作和休息调用。在第二种情况下,您只需要正确的回调,在第一种情况下,您应该使用$watch('A', onChangeA)

使用onChangeA似乎没问题,但事实上你无法控制你的应用程序:

  • 首先观察每个摘要周期,即使用户在页面的其他部分更改了某些内容。
  • A运行时,您不知道为什么{{1}}已更改 - 导致用户输入,计算原因或其他原因(即浮点错误)