给定使用ng-disabled="truthy_scope_variable"
的有条件禁用的文本输入字段,AngularJS禁用第一次范围变量被伪造的字段,但在后续更改时不启用它。结果,该字段保持禁用状态。我只能假设出现了问题,但控制台日志是空的。
truthy范围变量与单选按钮模型绑定,我甚至可以$watch
更改,但输入字段ng-disabled
无法按预期工作。我已经手动尝试调用$apply
,但看起来Angular正在触发DOM更改。
$scope.new_account = true
<input type="radio" ng-model="new_account" name="register"
id="radio_new_account" value="true" />
<input type="radio" ng-model="new_account" name="register"
id="radio_existing_account" value="false" />
<input type="password" ng-disabled="new_account" id="login-password"
name="password" ng-model="password" />
如果我最初设置$scope.new_account = false
,则该字段将被禁用,但永远不会重新启用。为什么会这样?
答案 0 :(得分:32)
这是因为HTML属性总是字符串,因此在您的示例中,ngDisabled在两种情况下都在评估字符串(“true”或“false”)。
要解决此问题,您应该将模型与ngDisabled中的字符串值进行比较:
ng-disabled="new_account == 'false'"
...或使用复选框,获取实际的布尔值:
<input type="checkbox" ng-model="existing_account" name="register" id="checkbox_new_account" />
<label for="checkbox_new_account">Is Existing Account</label>
Password:
<input type="password" ng-disabled="existing_account" name="password" ng-model="password" />
这是两个解决方案的PLNKR。
答案 1 :(得分:15)
有一种替代解决方案可以使用
NG-值
<input type="radio" ng-model="new_account" name="register"
id="radio_new_account" ng-value="true" />
<input type="radio" ng-model="new_account" name="register"
id="radio_existing_account" ng-value="false" />
<input type="password" ng-disabled="new_account" id="login-password"
name="password" ng-model="password" />
答案 2 :(得分:1)
截至2016年3月,绑定值将更新Chrome和Firefox中的ui,即使ng-disabled为true但在Safari中也不行。在Safari中使用ng-disabled时ui将不会更新,尽管输入元素value
属性将具有更新的值(更改后检查element.value
。)
在Safari中强制使用ng-model
或ng-value
指令进行ui更新,您必须使用ng-readonly而不是ng-disabled。