Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   radiobutton + checkbox mix (https://javascript.ru/forum/angular/50219-radiobutton-checkbox-mix.html)

dtzscln 17.09.2014 11:51

radiobutton + checkbox mix
 
Нужен элемент, который смесь радиобаттона и чекбокса.
Т.е. из ряда вариантов можно выбрать только один (как у радиобаттона), но с выбранного элемента можно снять выделение (как у чекбоксов).
Делаю через радобаттоны, навешиваю на них прослушивание клика, если елемент checked - делаю его не checked, вроде всё логично:

<input type="radio" ng-model="someData" value="0" radio-check>


app.directive("radioCheck", function() {
    return {
        require: "ngModel",
        link: function(scope, elem, attrs, ngModel) {
            elem.on("click", function(e) {
                if (elem.prop("checked") === true) {
                    ngModel.$modelValue = undefined;
                    ngModel.$viewValue = false;
                }
            });
        }
    }
});


Что я делаю не так?

artur-pro.z 18.09.2014 09:10

можно манипулировать не checked-атрибутом, а присвоить модели someData значение null - тогда все radio-инпуты станут "uncheched", т.е. ни один не будет выбран (в том и фишка ангуляра- работать с объектами, а не с html)
http://plnkr.co/edit/4xossl8AglvPMRriV9XN?p=preview

кстати, elem.prop("checked") всегда возвращает true

dtzscln 18.09.2014 10:15

Спасибо, работает.
А как можно сделать вашу директиву универсальной? Что бы без привязки к значеню ng-model
Т.к. у разных групп радиобаттонов ng-model будет разным
Пробовал заменить
scope.radio = null;

на
ngModel.$modelValue = null;

не работает

artur-pro.z 18.09.2014 13:13

ngModel.$setViewValue(null);
ngModel.$render(); 
scope.$apply()

varz62 27.12.2014 13:06

ребята может кто подскажет как такое на jquery реализовать

Malleys 27.12.2014 13:52

Цитата:

Сообщение от varz62
такое на jquery реализовать

не jQuery язык, а JavaScript. На этом это так:
<script>
var uncheckRadio = (function() {
  var current;
  return function(element) {
    if(current == element) {
      element.checked = false;
      current = null;
    } else
      current = element;
  }
})();
</script>
<form>
  <div>
    <input type="radio" name="product" value="1" onclick="uncheckRadio(this);" />
    <span>Шоколад</span>
  </div>
  <div>
    <input type="radio" name="product" value="2" onclick="uncheckRadio(this);" />
    <span>Мороженое</span>
  </div>
  <div>
    <input type="radio" name="product" value="3" onclick="uncheckRadio(this);" />
    <span>Груша</span>
  </div>
  <div>
    <input type="radio" name="product" value="3" onclick="uncheckRadio(this);" />
    <span>Вафля</span>
  </div>
</form>


Часовой пояс GMT +3, время: 19:48.