【问题标题】:ng-model not working for angular radio buttons with JSON object as valuesng-model 不适用于以 JSON 对象为值的角度单选按钮
【发布时间】:2017-05-01 22:36:30
【问题描述】:

我有一个简单的过滤器,我想在其中选择一个特定的值和类型,并使用它进行其他调用。这是我的观点的一个近似表示(我没有使用 ng-repeat 来创建这些单选按钮)。

<form>
<label>
    <input type="radio" name="ptf" ng-value="cntrl.filter.today_filter" ng-model="cntrl.filter.filter_value"> Today
</label>
<label>
    <input type="radio" name="ptf" ng-value="cntrl.filter.hour_filter" ng-model="cntrl.filter.filter_value"> Last 
</label>
    <select ng-model="cntrl.filter.hours" ng-options="num for num in cntrl.filter.time_range"></select>
<label> hours</label>
<label>
    <input type="radio" name="ptf" ng-value="cntrl.filter.date_filter" datepicker="" ng-model="cntrl.filter.filter_value">Select a Date
</label>
<button class="btn btn-info float-right" ng-click = "cntrl.refreshData()" >Update</button>
</form>

这基本上给了我 3 个选项,我可以选择今天,或者最后一个 n 小时或另一个日期。这是我cntrl的相关代码。

vm.filter = {
        today_filter: {
            type: 'today',
            value: 1
        },
        date_filter: {
            type: 'date',
            value: 2
        },
        hour_filter: {
            type: 'hours',
            value: 3
        },
        hours: 8,
        today: getFormattedDate(vm.current_date),
        time_range: [],
        filter_value: {
            type: 'today',
            value: 1
        }
    };

现在我将 filter_value (ng-model) 设置为带有type today and value 1 的对象。所以我希望默认情况下应该选择我的值为cntrl.filter.today_filter 的单选按钮。当我选择其他单选按钮时,filter_value 对象应相应更新。当然,这不会发生。这里有一些基本的错误吗?有关如何解决此问题的任何指示,或者可能对此采取不同的方法?

【问题讨论】:

    标签: angularjs angular-ngmodel angularjs-ng-value


    【解决方案1】:

    您的代码有一些问题:

    1. 您在视图中为控制器使用了错误的别名(spDashboardCntrl 和 cntrl)
    2. 使用实际相同的对象作为初始值,而不是看起来相同的新对象。

    为清楚起见,请参阅下面的工作示例。

    angular.module('app',[])
    .controller('myController', function() {
      var vm = this;
      
      vm.filter = {
            today_filter: {
                type: 'today',
                value: 1
            },
            date_filter: {
                type: 'date',
                value: 2
            },
            hour_filter: {
                type: 'hours',
                value: 3
            },
            hours: 8,
            today: '', //getFormattedDate(vm.current_date),
            time_range: []
        };
     vm.filter.filter_value = vm.filter.today_filter;
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
    <div ng-app="app">
      <div ng-controller="myController as vm">
        <form>
          <label>
            <input type="radio" name="ptf" ng-value="vm.filter.today_filter" ng-model="vm.filter.filter_value">Today
          </label>
          <label>
            <input type="radio" name="ptf" ng-value="vm.filter.hour_filter" ng-model="vm.filter.filter_value">Last
          </label>
          <select ng-model="vm.filter.hours" ng-options="num for num in vm.filter.time_range"></select>
          <label>hours</label>
          <label>
            <input type="radio" name="ptf" ng-value="vm.filter.date_filter" datepicker="" ng-model="vm.filter.filter_value">Select a Date
          </label>
          <button class="btn btn-info float-right" ng-click="vm.refreshData()">Update</button>
        </form>
        
        {{vm.filter.filter_value}}
      </div>
    </div>

    【讨论】:

    • spDashboardCntrl 和 cntrl 只是在复制和清理代码时出现的拼写错误。但是vm.filter.filter_value = vm.filter.today_filter 可以解决问题。谢谢。
    • 很高兴能帮上忙。你能为我(以及潜在的未来访客)投票吗?
    猜你喜欢
    • 2016-08-12
    • 2016-03-08
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2016-01-30
    • 2023-03-05
    相关资源
    最近更新 更多