ng-model不适用于角度单选按钮,JSON对象为值

时间:2016-12-16 07:19:06

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

我有一个简单的过滤器,我想选择一个特定的值并键入并使用它进行其他调用。以下是我在视图中的详细信息(我没有使用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对象应该相应更新。当然这不会发生。这里有一些基本的错误吗?关于如何解决这个问题的指针或者可能采用不同的方法?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  1. 您在视图中使用错误的控制器别名(spDashboardCntrl和cntrl)
  2. 使用实际相同的对象作为初始值,而不是看起来相同的新对象。
  3. 为清楚起见,请参阅下面的工作示例。

    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>