AngularJS: ng-модель не прив'язується до ng-встановлено прапорець


80

Я посилався на це, перш ніж задавати це питання.

AngularJs не прив'язує ng-перевірене до ng-моделі

Якщо ng-checkedоцінюється trueна htmlстороні, то ng-modelне оновлюється. Я не можу, ng-repeatяк було запропоновано у вищезазначеному питанні, тому що я повинен використовувати певний стиль для кожного прапорця.

Ось плюнкер, який я створив для ілюстрації своєї проблеми.

http://plnkr.co/edit/YsOsPh3vjkPMUUDa6r2t

Щоб побачити, що я хочу, відкрийте консоль і просто натисніть на Submitкнопку. Не встановлюйте жодних прапорців.

Спасибі заздалегідь!

Відповіді:


122

ngModelі ngCheckedне призначені для спільного використання.

ngCheckedочікує виразу, тому, кажучи ng-checked="true", ви в основному говорите, що прапорець завжди буде встановлено за замовчуванням.

Ви повинні мати можливість просто використовувати ngModel, прив’язану до логічного властивості на вашій моделі. Якщо ви хочете чогось іншого, то вам потрібно або використовувати ngTrueValueі ngFalseValue(які зараз підтримують лише рядки), або написати власну директиву.

Що саме ви намагаєтесь зробити? Якщо ви просто хочете, щоб перший прапорець був встановлений за замовчуванням, вам слід змінити модель - item1: true,.

Редагувати: Вам не потрібно надсилати форму для налагодження поточного стану моделі, до речі, ви можете просто скинути {{testModel}}у свій HTML (або <pre>{{testModel|json}}</pre>). Також ваші ngModelатрибути можна спростити ng-model="testModel.item1".

http://plnkr.co/edit/HtdOok8aieBjT5GFZOb3?p=preview


ng-checkedобчислюється як істина за допомогою виразу. Щоб вказати ng-model, що не пов’язано, я використав true там. Під час запуску контролера я хочу, щоб усі прапорці були зняті. Після деякого запиту ajax, я обчислюю ng-checkedпрапорець. Це коли мій ng-modelне оновлюється.
Ебілаш

5
@Abilash Ви не повинні використовувати ngChecked. З вашою моделлю все гаразд, вам просто потрібно встановити testModel.item1 = trueзворотний дзвінок ajax, а потім зателефонувати, $scope.$apply()щоб оновити вигляд.
Ленґдон,

2
Ми просто зробили помилку, використовуючи ng-checkedзамість ng-model... ніколи більше!
g00glen00b

Відповідно до примітки на docs.angularjs.org/api/ng/directive/ngChecked "Зверніть увагу, що цю директиву (ngChecked) не слід використовувати разом з ngModel, оскільки це може призвести до несподіваної поведінки."
Abhijeet

@Langdon, я затримався над цим питанням близько годин .. Ваш підказка $ scope. $ Apply () вирішив мою проблему. Дякую купу.
Нульовий покажчик

13

Ви можете використовувати ng-value-true, щоб сказати angular, що ваша ng-модель є рядком.

Я міг би отримати функцію ng-true-value, лише якщо б я додав зайві лапки приблизно так (як показано в офіційних документах Angular - https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D )

ng-true-value="'1'"

Дякую, це було виправлення для мене!
Jesper1

1

Що ви могли б зробити, це використовувати ng-repeatпередачу значення будь-чого, що ви повторюєте, туди ng-checkedі звідти, ng-classзастосовуючи ваші стилі залежно від результату.

Я робив щось подібне нещодавно, і це спрацювало для мене.


1

Може оголосити, що in ng-init також стає істинним

<!doctype html>
<html ng-app="plunker" >
  <head>
    <meta charset="utf-8">
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
    <script src="app.js"></script>
  </head>
  <body ng-controller="MainCtrl" ng-init="testModel['item1']= true">
    <label><input type="checkbox" name="test" ng-model="testModel['item1']"  /> Testing</label><br />
    <label><input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2</label><br />
    <label><input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3</label><br />
    <input type="button" ng-click="submit()" value="Submit" />
  </body>
</html>

І Ви можете вибрати Перший, і Об’єкт Також Тут показані істина, хибність, спалах


Існує лише декілька відповідних застосувань ngInit. Цією директивою можна зловживати, щоб додати непотрібну кількість логіки у ваші шаблони. Див. AngularJS ng-init Directive API Reference .
georgeawg

0

В ng-modelі ng-checkedдирективи не повинні використовуватися разом

З Документів:

ngПеревірено

Встановлює перевірений атрибут для елемента, якщо вираз усередині ngCheckedє істинним.

Зверніть увагу, що цю директиву не слід використовувати разом із неюngModel , оскільки це може призвести до несподіваної поведінки.

- AngularJS перевірено посиланням API API


Натомість встановіть бажане початкове значення з контролера:

<input type="checkbox" name="test" ng-model="testModel['item1']" ̶n̶g̶-̶c̶h̶e̶c̶k̶e̶d̶=̶"̶t̶r̶u̶e̶"̶ />
    Testing<br />
<input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2<br />
<input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3<br />
<input type="button" ng-click="submit()" value="Submit" />
$scope.testModel = { item1: true };

0

Вам не потрібно, ng-checkedколи ви використовуєте ng-model. Якщо ви виконуєте CRUD у своїй формі HTML, просто створіть модель для CREATEрежиму, який відповідає вашому EDITрежиму під час прив’язки даних:

Режим CREATE: модель лише зі значеннями за замовчуванням

$scope.dataModel = {
   isItemSelected: true,
   isApproved: true,
   somethingElse: "Your default value"
}

Режим редагування: модель із бази даних

$scope.dataModel = getFromDatabaseWithSameStructure()

Тоді чи , EDITабо CREATEрежим, ви можете послідовно використовувати ваш ng-modelдля синхронізації з базою даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.