2016-11-20 49 views
-1

我想在angularJs中选择一个下拉值并将其保存在服务中,这样我就可以在另一个视图上使用它来显示用户所选的值和完整的下拉列表。但是,当我尝试在controller中记录选定的值。我正在获取undefined的值。请帮助我如何继续。Angular Js dropdown所选值控制器内未定义

<td> 
    <select name="systems" class="pulldown1" id="systems" ng-model="system.selectedOption" ng-controller="EurexController" required ng-options="option.name for option in system.availableOptions track by option.id" ng-init="system.selectedOption=system.availableOptions[0]" ng-change="changed()"> </select> 
</td> 

控制器代码:

$scope.system = { 
    availableOptions: [{ 
    id: 'Domestic 1', 
    name: 'Domestic 1' 
    }, { 
    id: 'Domestic 2', 
    name: 'Domestic 2' 
    }, { 
    id: 'Global', 
    name: 'Global' 
    }, { 
    id: 'Far East', 
    name: 'Far East' 
    }], 
    // selectedOption: {id: 'Domestic 1', name: 'Domestic 1'} //This sets the default value of the select in the ui 
}; 

我使用AngularJS网站。但是提到selectedoption也尝试仍然不可能做到这一点。

console.log($scope.system.selectedOption); 
console.log(systems); 
+0

这是一个有效的问题,我得到了我的答案。有人可能会说为什么这是低调的? – Praveen

回答

0

这是更好地把容器元素在你的ng-controller属性,而不是直接对像一个<select>元素。这允许您在整个视图中使用控制器,而不是将其限制为<select>元素。您的console.log(systems);未定义,因为systems在控制器上下文中不存在。避免使用ng-init,除非您真的需要它,如the docs中所述。下面是使用你提供的代码的修改版本的工作示例:

angular.module('app', []) 
 
    .controller('ctrl', function($scope, myService) { 
 
    $scope.system = { 
 
     availableOptions: [{ 
 
     id: 'Domestic 1', 
 
     name: 'Domestic 1' 
 
     }, { 
 
     id: 'Domestic 2', 
 
     name: 'Domestic 2' 
 
     }, { 
 
     id: 'Global', 
 
     name: 'Global' 
 
     }, { 
 
     id: 'Far East', 
 
     name: 'Far East' 
 
     }] 
 
    }; 
 

 
    $scope.system.selectedOption = {}; 
 
    // uncomment the following line if you want to set a default selection 
 
    //$scope.system.selectedOption = $scope.system.availableOptions[0]; 
 

 
    $scope.optionChanged = function() { 
 
     myService.optionValue = $scope.system.selectedOption; 
 
     console.log($scope.system.selectedOption); 
 
    } 
 
    }) 
 
    .controller('ctrl2', function($scope, myService) { 
 
    $scope.myService = myService; 
 
    }) 
 
    .service('myService', function() { 
 
    var _optionValue = {}; 
 
    return { 
 
     get optionValue() { 
 
      return _optionValue; 
 
     }, 
 
     set optionValue(value) { 
 
      _optionValue = value || {}; 
 
     } 
 
    } 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script> 
 
<div ng-app="app"> 
 
    <div ng-controller="ctrl"> 
 
    <h2>ctrl</h2> 
 
    <div> 
 
     <select ng-model="system.selectedOption" ng-options="option as option.name for option in system.availableOptions" ng-change="optionChanged()"> 
 
     <option value="">Please select</option> 
 
     </select> 
 
    </div> 
 
    <div> 
 
     Selected option: {{ system.selectedOption | json }} 
 
    </div> 
 
    </div> 
 
    <div ng-controller='ctrl2'> 
 
    <h2>ctrl2</h2> 
 
    <div> 
 
     {{ myService.optionValue }} 
 
    </div> 
 
    </div> 
 
</div>

+0

为什么我使用ng-init时,我总是希望第一项显示在下拉菜单中。你能指导我如何写下角度服务/工厂,以便我可以在范围上设置选定的值。具有服务/工厂价值的主要理念是因为。在系统被选中后,我将用户带到下一页。我需要再次向他展示他被选中的系统。类型的redispaly页面。如果用户想要查看他选择的内容。 – Praveen

+0

这有点超出了原始问题的范围,但我已经更新了答案,以显示如何使用getter/setter服务在两个控制器之间共享选定的选项。 – Lex

+0

非常感谢。我把它提高了。但它说我会隐藏它因为我的名声较差 – Praveen