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

如何在AngularJS中进行双向过滤?

羊浩广
2023-03-14
问题内容

AngularJS可以做的有趣的事情之一是将过滤器应用于特定的数据绑定表达式,这是一种方便的方法,例如,应用区域性特定的货币或模型属性的日期格式。在范围上具有计算属性也很好。问题在于这些功能都不适用于双向数据绑定方案-
从作用域到视图仅单向数据绑定。在一个本来不错的图书馆中,这似乎是一个明显的遗漏-还是我错过了什么?

在KnockoutJS中,我可以创建一个读/写计算属性,该属性允许我指定一对函数,一个被调用以获取该属性的值,一个被设置为属性时被调用。例如,这使我可以实现文化意识的输入-
允许用户键入“ $ 1.24”,然后将其解析为ViewModel的float,并在输入中反映出ViewModel的更改。

我可以找到与此最相似的东西是使用。$scope.$watch(propertyName, functionOrNGExpression);这允许我在$scope更改属性时调用一个函数。但这不能解决例如文化意识的输入问题。当我尝试$watched$watch方法本身中修改属性时,请注意问题:

$scope.$watch("property", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.property = Globalize.parseFloat(newValue);
});

(http://jsfiddle.net/gyZH8/2/)

当用户开始输入时,输入元素会非常混乱。我通过将属性拆分为两个属性来改进它,一个用于未解析的值,另一个用于已解析的值:

$scope.visibleProperty= 0.0;
$scope.hiddenProperty = 0.0;
$scope.$watch("visibleProperty", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.hiddenProperty = Globalize.parseFloat(newValue);
});

(http://jsfiddle.net/XkPNv/1/)

这是对第一个版本的改进,但更加冗长,请注意,parsedValue范围更改的属性仍然存在问题(在第二个输入中键入内容,parsedValue直接更改。注意顶部的输入没有更新)。这可能是由于控制器操作或从数据服务加载数据而发生的。

有没有更简单的方法可以使用AngularJS来实现此方案?我在文档中缺少某些功能吗?


问题答案:

事实证明,有一个非常优雅的解决方案,但是没有充分记录。

格式化显示模型值可以由|操作员和角度操作员处理formatter。事实证明,ngModel不仅具有格式器列表,而且具有解析器列表。

1. ng-model用于创建双向数据绑定

<input type="text" ng-model="foo.bar"></input>

2.在角度模块中创建一个指令,该指令将应用于同一元素,并取决于ngModel控制器

module.directive('lowercase', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attr, ngModel) {
            ...
        }
    };
});

3.在link方法中,将自定义转换器添加到ngModel控制器

function fromUser(text) {
    return (text || '').toUpperCase();
}

function toUser(text) {
    return (text || '').toLowerCase();
}
ngModel.$parsers.push(fromUser);
ngModel.$formatters.push(toUser);

4.将新指令添加到已经具有 ngModel

<input type="text" lowercase ng-model="foo.bar"></input>

这是一个工作示例,该示例将文本转换为中的小写字母,input然后转换为模型中的大写字母

模型控制器API文档 还提供了简要说明和其他可用方法的概述。



 类似资料:
  • 问题内容: 我正在为教练创建一个网站,以通过使用社交媒体帮助人们拥有更健康的生活。目前,我正在通过ExpressJS服务器中的OAuth(前端为AngularJS)访问Twitter。 从AngularJS网站: 在200到299之间的响应状态代码被视为成功状态,并将导致调用成功回调。请注意,如果响应是重定向,则XMLHttpRequest将透明地跟随它,这意味着不会为此类响应调用错误回调。 我的

  • 问题内容: 我有一个内存中大约有1000个项目的数据集,正在尝试为此数据集创建一个传呼机,但是我不确定如何执行此操作。 我使用的是自定义过滤器功能来过滤结果,效果很好,但是以某种方式我需要获取页面数。 有什么线索吗? 问题答案: 查看UI Bootstrap的分页指令。我最终使用了它,而不是使用此处发布的内容,因为它具有当前使用的足够功能,并且具有详尽的测试规范。 视图 控制者 我做了一个工作的小

  • 问题内容: 如何在Angular中对过滤器进行单元测试? 问题答案: 注入然后用 所以要测试这个模板的等效性

  • 正在开发一个新产品,该产品将使用ESP8266、Xamarin应用程序和Azure IoTHub为客户的设备启用双向通信。 我们有C2D(云2设备)和D2C(设备2云)通信在应用程序和电除尘器上正常工作,但是我们没有找到任何关于设置IoTHub来解释传入的遥测消息、处理它们各自的“到:”字段并将它们回到C2D主题,这应该允许我们的目标设备接收它。 我们的尝试: 逻辑应用。能够触发进入队列的消息,但

  • 问题内容: 我有一个简单的Bean,它具有彼此相关的某些属性。例如,此bean具有一个名为 discountRate 的属性和另一个名为 DiscountValue 的属性。DiscountRate是应用于销售的折扣百分比(%)。discountValue是应用于销售的折扣值($)。由于用户可以告知百分比或值,而且我需要将两个值存储在数据库中,因此JavaFX双向绑定可以解决此问题,但是,正如您可