角度输入模型有条件地从一个属性读取,写入另一个属性
Angular input model conditionally reads from one property, writes to another
我有一个 Person 类,其中对该人的编辑必须由管理员用户验证。
每个属性都有一个"已批准"和"tmp"版本。有时未设置"tmp"版本:
person = {first:'Bob', firstTmp:'Robert', last:'Dobbs', lastTmp:undefined}
显示人员时,如果设置了"tmp"值,我想显示"tmp"值,否则显示"已批准"值。写入时,我想写入"tmp"值(除非以管理员身份登录)。
理想情况下,这不需要大量的自定义标记,也不需要为每个属性编写覆盖方法(大约有 100 个)。像这样的东西会很好:
<input ng-model="person.first"
tmp-model="person.firstTmp"
bypass-tmp="session.user.isAdmin" />
显示值时,如果已定义 tmp 值,则显示该值。否则显示批准的值。
写入值时,除非以管理员身份登录,否则请写入 tmp 值。 管理员直接写入批准的值。
在 Angular 中实现这一点的干净方法是什么?
- 以某种方式扩展 NgModelController ?
- 在输入上使用过滤器/指令?
- 掩护方法?
- 只是在服务器端编写?
我将尝试一一介绍您的选项:
以某种方式扩展 NgModelController ?
我认为这不是一个好主意。如果出现问题,你不知道你是否可以依靠像ng-model
这样基本的东西,那就不好
只是在服务器端编写?
这似乎是更简单的方法(如果您已经知道或发现在后端管理它很容易),尽管交互需要向服务器发出新的请求。
在输入上使用过滤器/指令?
我相信这将是最好的方法,因为只需查看标记就很容易理解发生了什么。它是有角度的,您已经知道像tmp-model
这样的某些属性正在扩展标记。
掩护方法?
这也很容易实现,并且您将在 cover 方法中实现某种"业务逻辑"作为验证器。
鉴于我在答案中扩展了一点,我可以给你一个最后一个的内联示例。
<input ng-model="person.firstTmp"
ng-init="person.firstTmp = person.firstTmp || person.first"
ng-change="updateProperty(person, 'first')" />
在控制器上,您可以执行以下操作:
$scope.updateProperty = function(person, propertyName) {
// The temporary property has already been changed, update the original one.
if($scope.session.user.isAdmin)
person[propertyName] = person[propertyName + 'Tmp'];
}
相关文章:
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何通过HTML+CSS中的另一个元素Selector更改元素的属性值
- 你能用来自数组的属性名称生成一个对象吗
- 一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性
- AngularJS:如何用同一对象的另一个属性访问一个属性
- 如何为下拉列表的每个选项添加一个属性
- 如果另一个属性相同,请删除该属性
- Knockout observable没有观察到其中一个属性
- 使用数据属性将HTML数据复制到另一个元素
- 将javascript对象(属性+值)合并到一个对象中
- 使用 JavaScript 一次为一个元素设置多个属性
- 我如何选择/点击一个带有for=“”的元素"属性[量角器]
- 如何计算一个对象中五个属性中有多少是非null的
- 检查来自不同数组的两个元素的一个属性是否相等
- 获取一个对象´s属性的名称使用字符串
- 选择一个元素,使其最近的具有特殊属性的父元素具有特殊值
- JavaScript-通过类似的属性查找对象,并将其推送到一个新的数组中
- 在html页面的属性周围添加了一个额外的空间
- 谷歌闭包编译器内联了一个重复使用的私有属性 - 一个缺陷还是我错过了什么
- 给一个嵌套的属性/属性一个自定义值