AngularJS case à cocher ng dynamique-expression de la valeur vraie

j'essaie de construire une calculatrice pour les prix de la garderie en angle.

chaque emplacement dans la franchise de la société a des prix séparés pour chaque jour. Donc mon idée était de construire un formulaire, avec d'abord un select qui vous permet de sélectionner l'emplacement, puis une série de cases à cocher pour les jours.

j'ai des problèmes avec ng-true-value dans les cases à cocher en sélectionnant les bons prix à partir de mon fichier json.

mise à jour: Plunkr Ajouté: http://plnkr.co/edit/MDmrqaH1VzLBzjd5eHgT?p=preview

réfléchir à ce code:

        <p class="kind_section">Choose location</p>
        <select ng-model="formData.location" ng-options="location.title for location in data.bso"></select>

        <p class="kind_section">Select days</p>

        <input type="checkbox" ng-model="location.day.mon" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.monday}}" ng-false-value="0">Ma
        <input type="checkbox" ng-model="location.day.tue" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.tuesday}}" ng-false-value="0">Di<br />
        <input type="checkbox" ng-model="location.day.wed" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.wednesday}}" ng-false-value="0">Wo
        <input type="checkbox" ng-model="location.day.thu" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.thursday}}" ng-false-value="0">Do<br />
        <input type="checkbox" ng-model="location.day.fri" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.friday}}" ng-false-value="0">Vr

tout d'abord le select définit formData avec un ID de localisation, puis je veux utiliser cet ID pour sélectionner les prix de jour pour l'emplacement correspondant et les mettre à ng-true-valeur.

j'utilise ng-true-value="{{data.bso[formData.location.ID].prices.monday}}" pour cela. Cela ne fonctionne pas.

quand je règle l'ID manuellement comme ng-true-value="{{data.bso[0].prices.monday}}" ça fonctionne. Pourquoi le résultat du select n'est-il pas repris par ng-vrai-valeur?

Ceci est mon fichier json:

  $scope.data = {
                "bso": [
                  {
                    "ID": 0,
                    "title": "Locatie 1",
                    "prices": {
                        "monday": 130,
                        "tuesday": 130,
                        "wednesday": 200,
                        "thursday":130,
                        "friday": 130
                    }
                  },
                  {
                    "ID": 1,
                    "title": "Locatie 2",
                    "prices": {
                        "monday": 430,
                        "tuesday": 530,
                        "wednesday": 600,
                        "thursday":990,
                        "friday": 730
                    }
                  }
                ]
              };
17
demandé sur AlwaysALearner 2014-07-15 16:51:41

3 réponses

L'Expression dans la valeur ng-true-ne sera évaluée qu'une seule fois, donc elle ne sera pas dynamique.

une approche alternative consiste à calculer les valeurs dans la fonction de rappel ng-change à la place.

s'il vous Plaît voir ma fourchette http://plnkr.co/edit/9zYS3OZ0sSkXX9rHwcgv?p=preview pour l'exemple complet.

Dans le html:

<input type="checkbox" ng-model="selectedDays.monday" ng-change="calculatePrice()" /> Mon
<input type="checkbox" ng-model="selectedDays.tuesday" ng-change="calculatePrice()" /> Tue            <br />
<input type="checkbox" ng-model="selectedDays.wednesday" ng-change="calculatePrice()" /> Wed
<input type="checkbox" ng-model="selectedDays.thursday" ng-change="calculatePrice()" /> Thu            <br />
<input type="checkbox" ng-model="selectedDays.friday" ng-change="calculatePrice()" /> Fri

et dans le contrôleur:

$scope.calculatePrice = function(){
  $scope.formData.location.day = {};

  angular.forEach($scope.selectedDays, function (selected, day) {
    if (selected) {
      $scope.formData.location.day[day.slice(0, 3)] = $scope.data.bso[$scope.formData.location.ID].prices[day];
    }
  });
}

$scope.selectedDays = {};
2
répondu runTarm 2014-07-15 14:34:20

une autre approche consiste à retarder la création de la case à cocher jusqu'à ce que la valeur soit prête (sur scope ou autre).

dans mon cas, je chargeais une valeur via http qui n'était pas sur la portée lorsque la case à cocher a été créée. Donc je l'ai juste enveloppé dans un ng-if.

          <div class="checkbox" ng-if="viewData.conditionId != undefined">
            <label>
              <input type="checkbox" ng-true-value="{{'\''+ viewData.conditionId + '\''}}" ng-false-value="undefined" ng-model="model.conditionId" required />
              I agree
            </label>
          </div>

ce qui a parfaitement fonctionné pour mon scénario. Le vôtre est un peu différent mais le même principe devrait s'appliquer-reportez la création de la case à cocher jusqu'à ce que vous la valeur étant liée est y.

et oui les stupides guillemets semblent nécessaires.

2
répondu Sam 2015-09-01 00:43:07