我有一个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中实现这个目标的一个很好的干净方法是什么?
答案 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'];
}