Подтвердить что ты не робот

Угловой JS условный ng-disabled не включает

Учитывая условно отключенное текстовое поле ввода с помощью ng-disabled="truthy_scope_variable", AngularJS отключает это поле при первой смене переменной области видимости, но не включает ее при последующих изменениях. В результате поле остается отключенным. Я могу только предположить, что что-то пошло не так, но журнал консоли пуст.

Переменная reality scope привязана к модели переключателя, и я даже могу ее изменить, но поле ввода 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, поле будет отключено, но никогда не будет включено. Почему это происходит?

4b9b3361

Ответ 1

Существует альтернативное решение, просто использующее

нг-значение

 <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

Это потому, что атрибуты 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 с обоими решениями.

Ответ 3

С 2016 года привязанные значения будут обновлять ui в Chrome и Firefox, даже если ng-disabled имеет значение true, но не в Safari. В Safari, когда вы используете ng-disabled, обновление ui не будет обновлено, хотя свойство input value будет иметь обновленное значение (после изменения его можно проверить element.value).

В Safari для принудительного обновления ui с помощью директив ng-model или ng-value вы должны использовать ng-readonly вместо ng-disabled.