如何在控制器内获取ng-repeat单选按钮值?

时间:2013-12-17 17:19:28

标签: javascript angularjs

我有一个表单,里面有不同的输入标签和标签:

form action="">
  <div class="fields" data-ng-repeat="option in question.body.options">
        <input id="{{option.text}}" type="radio" name="gender" ng-model="demographic_value" ng-value="{{option.text}}">
        <label for="{{option.text}}">{{option.text}}</label>
    </div>
</form>

我想访问所选单选按钮的值,数据是如何绑定的?是否有任何标准方法,或“isChecked”值或类似的东西?

编辑:好的,更清楚:我想只选择选项。在控制器内部,而不是在视图中。

所以我可以通过HTTP将所选值发送到服务器。

  1. 单击单选按钮
  2. 执行var checked = $ scope.radiobutton
  3. 之类的操作
  4. 的Array.push(选中)
  5. 发送到服务器

2 个答案:

答案 0 :(得分:1)

使用共享服务并将其注入任何控制器:

    angular.module("yourAppName", []).factory("mySharedService", function(){

        var mySharedService = {};

        mySharedService.values = {};

        mySharedService.setValues = function(params){
            mySharedService.values = params;
        }

          return mySharedService; 
   });

将其注入任何控制器后。 例如:

function MainCtrl($scope, myService) {
  $scope.radioButtons= myService.values;
}

function AdditionalCtrl($scope, myService) {
  $scope.var= myService.values;
}

编辑:对于选中/未选中的值:

您可以使用观察者:

$scope.$watch('question.body.options', function (changedOptions) {
    //some actions with changed options
}, true);

更新: 至于你的更新:

1)您应该创建观察者,例如上面的。

2)进入观察者,当值发生变化时 - 用你的值初始化必要的服务属性(调用setValue函数)

3)您应该将sharedService注入另一个控制器,并且可以从此服务获取这些值。

4)调用$ http或$ resource方法在服务器上发送此值。

答案 1 :(得分:0)

  1. ng-repeat为每个项目创建自己的范围,因此您可能无法访问它。尝试将模型放在父范围内的对象中。
  2. ng-value接受表达式,但不接受{{expression}}
  3. http://jsfiddle.net/g8qLY/

    HTML:

    <form ng-app ng-controller="ctrl" name="inputform">
        <label for="{{option}}" ng-repeat="option in options">
            {{option}}
            <input id="{{option}}" type="radio" name="gender" 
                ng-model="inputform.radioinput" ng-value="option">
        </label>
        <div ng-bind-template="Radio Input: {{inputform.radioinput}}"/>
    </form>
    

    JS:

    function ctrl($scope) {
        $scope.options = ['Option1', 'Option2', 'Option3'];
    }