【问题标题】:AngularJS checkbox dynamic ng-true-value expressionAngularJS 复选框动态 ng-true-value 表达式
【发布时间】:2014-09-05 16:14:41
【问题描述】:

我正在尝试在 Angular 中构建一个计算日托价格的计算器。

公司特许经营中的每个地点每天都有单独的价格。所以我的想法是构建一个表单,首先是一个允许您选择位置的选择,然后是一系列日期的复选框。

我在从我的 json 文件中选择正确价格的复选框中遇到 ng-true-value 问题。

更新: 添加了 Plunkr:http://plnkr.co/edit/MDmrqaH1VzLBzjd5eHgT?p=preview

考虑这段代码:

        <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

首先选择将 formData 设置为位置 ID,然后我想使用此 ID 选择匹配位置的日价格并将其设置为 ng-true-value。

我为此使用ng-true-value="{{data.bso[formData.location.ID].prices.monday}}"。这不起作用。

当我像 ng-true-value="{{data.bso[0].prices.monday}}" 这样手动设置 ID 时,它确实有效。为什么选择的结果没有被ng-true-value拾取?

这是我的 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
                    }
                  }
                ]
              };

【问题讨论】:

  • 您使用的是哪个版本的 Angular?上一个ngTrueValue有变化。
  • 我使用的是 v1.3.0 Beta.13
  • 使用ng-change 查看模型是否正在更新。 formData 对象是否存在于您的范围内? ng-select 使用子作用域。
  • 它确实更新了.. 我要提供一个 Plunkr,等等
  • AFAIK,ng-true-value 只解析给定的表达式一次。在评估表达式时,formData.location.ID 肯定仍然是未定义的。

标签: javascript json angularjs checkbox


【解决方案1】:

似乎ng-true-value 不接受非常量表达式。来自docs(v1.3.0)

某些与 ngModel 结合使用的属性(例如 ngTrueValue 或 ngFalseValue)将只接受常量表达式。

使用常量表达式的例子包括:

<input type="checkbox" ng-model="..." ng-true-value="'truthyValue'">
<input type="checkbox" ng-model="..." ng-false-value="0">

非常量表达式的示例包括:

<input type="checkbox" ng-model="..." ng-true-value="someValue">
<input type="checkbox" ng-model="..." ng-false-value="{foo: someScopeValue}">

理想的解决方法可能是在 ng-clickng-change 上调用 Controller 方法,您可以在其中分析所有复选框的真实值或非真实值。

【讨论】:

【解决方案2】:

另一种方法是延迟复选框的创建,直到值准备好(在范围或其他方面)。

在我的情况下,我通过 http 加载了一个值,该值在创建复选框时不在范围内。所以我只是把它包装在一个 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>

这非常适合我的场景。你的有点不同,但应该适用相同的原则 - 延迟创建复选框,直到你知道绑定的值在那里。

是的,愚蠢的引号似乎是必要的。

【讨论】:

  • 您也许可以简化引号。见stackoverflow.com/a/29019232/4297364
  • 这也适用于我,虽然我不需要引号,因为我想要的表达式是真/假,而不是字符串。
【解决方案3】:

ng-true-value 中的表达式只会被评估一次,因此它不会是动态的。

另一种方法是计算 ng-change 回调中的值。

完整示例请查看我的 fork http://plnkr.co/edit/9zYS3OZ0sSkXX9rHwcgv?p=preview

在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

在控制器中:

$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 = {};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 2014-07-27
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多