角度输入模型有条件地从一个属性读取,写入另一个属性

时间:2014-04-09 00:22:22

标签: javascript forms angularjs angularjs-directive

我有一个Person类,必须由管理员用户验证对此人所做的编辑。

每个属性都有一个"已批准"和" tmp"版。有时候" tmp"版本未设置:

person = {first:'Bob', firstTmp:'Robert', last:'Dobbs', lastTmp:undefined}

在显示此人时,我想显示" tmp"如果设置了值,否则显示"已批准"值。写作时,我想写信给" tmp"值(除非以管理员身份登录)。

理想情况下,这不需要大量的自定义标记,也不需要为每个属性编写封面方法(大约有100个)。这样的事情会很好:

<input ng-model="person.first" 
       tmp-model="person.firstTmp" 
       bypass-tmp="session.user.isAdmin" />

显示值时,显示tmp值(如果已定义)。否则显示批准的值。

写入值时,请写入tmp值,除非以管理员身份登录。管理员直接写入批准的值。

在Angular中实现这个目标的一个很好的干净方法是什么?

  • 以某种方式扩展NgModelController?
  • 在输入上使用过滤器/指令?
  • 封面方法?
  • 只是写服务器端吗?

1 个答案:

答案 0 :(得分:1)

我将尝试逐个完成您的选择:

  

以某种方式扩展NgModelController?

我不认为这是个好主意。如果出现问题并且你不知道你是否甚至可以依赖ng-model

这样的基本内容,那就不好了。
  

只是写服务器端吗?

这似乎是更简单的方法(如果您已经知道或者发现在后端管理它很容易),尽管交互需要向服务器发出新请求。

  

在输入上使用过滤器/指令?

我相信这是最好的方法,因为通过查看标记很容易理解发生了什么。这是有角度的,你已经知道像tmp-model这样的属性正在扩展标记。

  

封面方法?

这也很容易实现,你将在封面方法中实现某种“业务逻辑”作为验证器。

鉴于我的答案有所扩展,我可以给你一个最后一个的内联示例。

<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'];
}