Angular.js: Функция: ngTrueValue должен принимать нестроковые значения.

Созданный на 25 июл. 2012  ·  60Комментарии  ·  Источник: angular/angular.js

Для флажков модели ng ngTrueValue поддерживает только строку. На самом деле он должен просто принять угловое выражение и eval, чтобы получить значение, чтобы он поддерживал, скажем, объект js.

PRs plz! forms moderate feature

Самый полезный комментарий

У меня только что было интересное осознание. То, что я пытался сделать - и, судя по всему, то, что пытались сделать многие из вас, - на самом деле можно выполнить с помощью:

ng-true-value="{{ myVariable | json }}"

Это поддерживает строковые значения, логические значения и числа. Пока не уверен, нравится ли мне это на самом деле, но я определенно нашел это интересным. И, возможно, это поможет кому-то еще.

Все 60 Комментарий

Я не совсем уверен в цели ngTrueValue , за исключением того, что это похоже на директиву удобства для добавления часов к контроллеру для одного случая. Я подозреваю, что если вы хотите установить для какой-либо модели сложное значение, может быть чище поставить $scope.$watch на модель вашего флажка и соответствующим образом изменить модель в области видимости.

@coli , вы имеете в виду конкретный вариант использования? @IgorMinar , @mhevery , @vojtajina , что вы думаете?

На самом деле вариант использования довольно распространен:

У меня есть массив объектов категории, например, $scope.categories=[{id:5,name:"First"},...}

Затем у меня есть массив selectedCategories, содержащий подмножество этих категорий.

Я хочу показать флажок для некоторых категорий (пейджинг), и когда вы устанавливаете или снимаете флажок, selectedCategories изменяется.

На самом деле я написал директиву, которая перезапишет поведение флажка по умолчанию, чтобы добавить поддержку вышеуказанного. Я могу поделиться кодом, если нужно.

Мое использование закончилось так: keyField был необходим для сравнения объектов, так как в моем случае выбранный групповой объект и групповой объект могли изначально немного отличаться (они исходили из двух разных API-интерфейсов бэкэнда)

<ng-repeat="group in groups>
    <input type='checkbox' ng-model="selectedArray" ng-true-value="group" mi-checkbox="{keyField:'id'}">
</>

Черт возьми, у меня есть гораздо более простой вариант использования, который, как я был разочарован, не работает — мне нужно целое число, а не строка!

Я использую шаблон для отображения флажка. В этом случае я не могу знать истинное значение, это значение зависит от конкретной управляющей информации, которую я хочу отобразить.

Я бы тоже предпочел, чтобы ng-true-value было выражением. Если ваше количество флажков определяется во время выполнения, вам нужно прибегнуть к методам области действия с обертками тайм-аута.

+1. Выражение поддержки в ng-true-value

+1 Целое число поддержки в ng-true-value

+1 за выражение вместо строки

+1 Поддержите выражения!

+1 за выражения

+1 объекты поддержки:

<div ng-repeat="group in groups">
    <input type='checkbox' ng-model="array[$index]" ng-true-value="group" />
</div>

@coli , не могли бы вы поделиться написанной вами директивой? Это было бы большим подспорьем для меня, пока этот вопрос все еще рассматривается. Может в сущности?

@brab К сожалению , я написал это на предыдущей работе, но в основном это похоже на встроенный код для флажков, я копировал / вставлял в пользовательскую директиву и добавлял поддержку выражений. (+ уродливый хак для удаления встроенного)

Выражения были бы прекрасны! Однако можно было бы ожидать даже проверки истинности javascript для целых чисел. Я использую $resource для заполнения объекта, который возвращает целочисленные значения (1 или 0) из логического значения базы данных. Затем они прикрепляются к $scope, для которого привязана ng-модель на входе. Был очень удивлен, обнаружив, что установка ng-true-value="1" не распознает целое число 1 как истинное и устанавливает флажок. Тем временем рассмотрю другие методы, упомянутые в нем.

+1

+1 за выражения

+1. Выражение поддержки в ng-true-value

+1 за поддерживающие выражения!
В моем случае нужно построить форму динамически.
Например: http://jsfiddle.net/federosky/N8Wjm/5/

+1 за целое число

1+ для целого числа

+1 для целого числа (или любого числа JS)

:+1: для поддержки выражений пожалуйста! пожалуйста! пожалуйста! :-)

+1 по крайней мере для целочисленной поддержки, желательно также и для выражений.

Как насчет того, чтобы кто-то выдвинул PR для поддержки номеров?

+1 за выражения

+1 за целое число

+1 за целое число

+1

:+1: для выражений.

+1. Просто столкнитесь с проблемой, когда у меня есть логическое свойство «скрыто», которое должно быть представлено как флажок «Видимый» на странице. Итак, мне нужно, чтобы состояние «проверено» означало «ЛОЖЬ», а «непроверено» означало «ИСТИНА».

Интересно, что было бы простым решением этой проблемы? Мне не очень нравится писать свою собственную директиву флажка или загрязнять область действия обратными вспомогательными логическими свойствами только для того, чтобы использовать их для косвенной привязки.

Это, вероятно, довольно тривиально реализовать, я попробую перед сном.

Мой патч поддерживает только константные выражения, но если он действительно нужен людям, я полагаю, подойдет любое выражение. Однако это был самый простой способ не вызвать критических изменений.

+1

+1

+1

+1 для целочисленного типа

+1

+1 за выражения

+1

+1

+1

+1

:+1:

Это хаки, которые требуются сейчас (много WTF):

<input type="checkbox" ng-model="fake" ng-checked="!notChecked" ng-change="notChecked = !notChecked"/>

+1

+1 уже два года "+1". Почему мы еще не поддерживаем это?

@jancarloviray , +1

Жаль: для меня это означает, что все стало сложнее.
Раньше я использовал
ng-true-value="{{proxyOnValue}}"
где proxyOnValue был инициализирован в контроллере.
(Это же представление повторно используется для конфигурации прокси-сервера HTTP/HTTPS/FTP/POP3/SMTP, где фактическое значение отличается.)

Теперь я попытался
ng-true-value="proxyOnValue"
но это вызывает исключение, потому что выражение не является постоянным.

Так что это означает, что я должен заменить простую реализацию (ngTrueValue) более сложной реализацией (watch или Object.defineProperty), так что на самом деле это противоположно тому, что было задумано.

Зачем это искусственное ограничение?
Просто

  • использовать текущее значение ngTrueValue/ngFalseValue всякий раз, когда модель изменяется или пользователь устанавливает флажок
  • на всякий случай используйте внутренние часы для выражений ngTrueValue/ngFalseValue (если они не являются постоянными) и обновляйте состояние флажка при срабатывании часов.

@eekboom — вы все еще можете использовать интерполяцию: http://plnkr.co/edit/LQ6OpFjkjiFLxxMJ9hxj?p=preview

@petebacondarwin - он может использовать интерполяцию, но это ему не поможет: http://plnkr.co/edit/nNwjEkPIDJwe60HWX950?p=preview
Значение проверяется только один раз - более поздние изменения не учитываются, поэтому всегда используется только начальное значение.

@dliebscher - насколько я понимаю, @eekboom хотел инициализировать его только один раз:

Ранее я использовал ng-true-value="{{proxyOnValue}}" , где proxyOnValue был инициализирован в контроллере.

И да, и нет: я хочу инициализировать его только один раз, но только после того, как конфигурация прокси будет загружена через xhr. Таким образом, он изменяется (из неопределенного) один раз после инициализации представления.

@eekboom
Когда я мигрировал с 1.2, я переключился на следующее:

ng-true-value="{{proxyOnValue}}"

к

ng-true-value="'{{proxyOnValue}}'"

Который работает, но выглядит глупо

У меня только что было интересное осознание. То, что я пытался сделать - и, судя по всему, то, что пытались сделать многие из вас, - на самом деле можно выполнить с помощью:

ng-true-value="{{ myVariable | json }}"

Это поддерживает строковые значения, логические значения и числа. Пока не уверен, нравится ли мне это на самом деле, но я определенно нашел это интересным. И, возможно, это поможет кому-то еще.

getu-lar, я пробовал то, что вы сказали, со сложным объектом, это работает. В ng-false-value я заполнил ng-false-value="{}" . Прежде чем работать с данными, я передаю фильтр, чтобы отсечь все ложные значения из массива. Итак, большое спасибо!

решение getu-lar сработало для меня. Спасибо.

Я пытался использовать выражение, которое разрешалось в строку с символом подчеркивания, например "101_3". Я использовал решение getu-lar, и оно просто работает. Хотя похоже на взлом. Спасибо, что поделились!

+1 за выражения

+1

Не похоже, что у команды Angular есть большая надежда предоставить разумную директиву флажка для серии 1.x... Это не может быть слишком сложно. Поддержка выражений будет полностью обратно совместима из-за обязательного заключения в кавычки.

До тех пор предложенный обходной путь работает для меня:

ng-true-value="{{ myVariable | json }}"

Убедитесь, что myVariable определено в контроллере. Я попытался определить это в пост-ссылке, и это не сработало.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги