当前位置: 首页 > 面试题库 >

AngularJS如何在模糊时强制重新渲染输入

万选
2023-03-14
问题内容

我有一些自定义验证代码,其中包括$ formatter。(为了正确起见,我将货币以便士存储,但以磅为便士显示。)

如果用户在输入中键入“ 10”(这是一个有效值),则输入移至下一个字段后,输入仍显示“ 10”。

我希望它显示10.00以保持一致性

如果模型将值更改为1000,那么格式化程序将使该字段显示为“ 10.00”。

我希望格式化程序在field.blur()上运行(只要输入有效)。

我的问题是,如果将模型值从10更改为10,可以理解的是没有更改,因此该字段不会重新呈现。

码:

var CURRENCY_REGEXP = /^\-?\d+(\.?\d?\d?)?$/;
app.directive('currency', function() {
  return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
      ctrl.$parsers.unshift(function(viewValue) {
        if (CURRENCY_REGEXP.test(viewValue)) {
          // it is valid
          ctrl.$setValidity('currency', true);
          console.log("valid");
          return viewValue * 100;
        } else if (viewValue === '') {
          return 0;
        } else {
          // it is invalid, return undefined (no model update)
          ctrl.$setValidity('currency', false);
          console.log("invalid");
          return undefined;
        }
      });
      ctrl.$formatters.push(function(modelValue) {
         if (modelValue === 0) { // we're using integer pence, so this is safe
             return '';
         }
         return (modelValue / 100).toFixed(2); 
      });
    }
  };
});

PS这与Angular的内置“货币”无关。

更新:根据安迪的回答,我添加了一个“ renderOnBlur”指令。它被调用,但是调用render方法不会重新渲染输入。即“ 10”保持为“
10”,而不是根据需要更改为“ 10.00”。

(当模型值在这些字段中更改时,它们将正确显示为小数点后两位。)

Andy提到的页面http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController说您必须实现$render自己。这似乎很奇怪,因为当模型值更改时,输入已经正确呈现。

app.directive('renderOnBlur', function() {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function(scope, elm, attrs, ctrl) {
            elm.bind('blur', function() {
                console.log('rendering ctrl', ctrl);
                ctrl.$render();
            });
        }
    };  
});

PS:我不知道该怎么办restrict: 'A',-在最糟糕的情况下,这是真正的“货神教”式编程。该require: 'ngModel',填充似乎是必要ctrl的参数。

受@Dan Doyen的回答启发,我将其重写为:

app.directive('renderOnBlur', function() {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function(scope, elm, attrs, ctrl) {
            elm.bind('blur', function() {
                var viewValue = ctrl.$modelValue;
                for (var i in ctrl.$formatters) {
                    viewValue = ctrl.$formatters[i](viewValue);
                }
                ctrl.$viewValue = viewValue;
                ctrl.$render();
            });
        }
    };  
});

这具有对任何$ formatter通用的好处,而不是像Dan的回答那样重复格式化程序代码。


问题答案:

您的控制器的$ modelValue正在正确更新,但是,由于blur事件发生在angular之外,因此您的$ viewValue似乎没有。这个怎么样?

 elm.bind('blur', function() {
       ctrl.$viewValue = (ctrl.$modelValue / 100).toFixed(2);
       ctrl.$render();
 });


 类似资料:
  • 问题内容: 由于存在题外问题,这是一种重写: 我写了一个下拉菜单指令。我将指令两次用作工作流。第一个下拉菜单通过更改操作触发第二个模型的刷新。尽管模型正确更新,但视图未正确更新。在下拉菜单中多次选择项目时,即使角度模型的console.log()正确,第二个下拉菜单也会显示带有新项目的旧项目。 该视图具有无限递归。使用具有ng / template的ID的ng-include可以自我递归: 我最初

  • 问题内容: 我创建了一个生成Twitter按钮的指令。由于这些按钮上的作用域变量可能会更改,因此我需要在按钮发生时重新构建它。目前,我正在使用jQuery 链接元素并重建按钮。 有没有办法让指令完全重新呈现模板呢? 问题答案: 这是一个可重用的指令,您可以使用它在发送事件时重建被包含的内容: 这是一个jsFiddle演示其工作原理:http : //jsfiddle.net/robianmcd/Z

  • 基本上,从接收一个单击事件,然后我需要多次更改HTML元素,问题是WebView只显示最后一次更改,这意味着渲染不是立即进行的。 问题:如何制作

  • 问题内容: 考虑下面的钩子示例 基本上,我们使用this.forceUpdate()方法强制组件在React类组件中立即重新呈现,如以下示例所示 但是我的查询是如何强制上述功能组件立即使用挂钩重新渲染? 问题答案: 可以使用或进行,因为在内部使用: 不打算在正常情况下使用,仅在测试或其他出色情况下使用。可以以更常规的方式解决这种情况。 是使用不当的例子,是异步的性能,而且不应该被强迫只是因为状态更

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 问题内容: 即使dataSource中的数据未更改,是否也可以强制重新渲染ListView?我的应用程序中的选项卡栏中有一个ListView,我希望每次选择该选项卡时都重新绘制它,而不管数据是相同还是已更改。 我尝试使用参数,但这没有帮助。任何帮助将非常感激 问题答案: 因此,据我所知,您的用例是由于更改而重新呈现ListView的所有行。我不知道是什么,要由您确定,但是我会用它来解释我的答案: