Angular with directive选择并提交

时间:2015-10-16 16:22:45

标签: javascript angularjs forms select

在select中创建空白选项可能非常烦人。任何解决方案:

angular.module('myApp', ['ui.bootstrap','angularSpinners'])
.controller("StudentController",function($scope,$http,$modal){
   $scope.students=[
     {"first_name":"Miguel","last_name":"Smith","id":10},
     {"first_name":"Ann","last_name":"Jones","id":11}
   ];
   $scope.courselist=[
      {"first_name":"Dave","last_name":"Smith","id":8},
      {"first_name":"Mike","last_name":"Winner","id":9}
   ];
   $scope.sDefault=$scope.courselist[0].id;

})
.directive('thisView', function() {
   return {
     restrict:"E",
     scope: {
       students:"=",
       courselist:"=",
       sDefault:"="
   },
   templateUrl: 'this-view.html',
   controller: function($scope) {
      $scope.remStudent = function(remId) {
         $scope.students.splice( $.inArray(remId, $scope.students), 1 );
         $scope.courselist.push(data);//data will be returned from http not relevant for question
     };
     $scope.addStudent = function(addId) {//this from student list
        $scope.students.push(data);//data will be returned from http not relevant for question
        $scope.courselist.splice( $.inArray(addId, $scope.courselist), 1 );
     };     
   }
});

在主页上:

<div ng-controller="StudentController">
   {{sDefault}}  //works
   <this-view students="students" courselist="courselist" sDefault="sDefault"></this-view>
</div> 

此-view.html:

   {{sDefault}} //doesn't work

<form ng-submit="addStudent(addStudentId)">
           <select  class="form-control" ng-model="addStudentId" >
                <option value="" selected>Default</option>
                 <option  ng-repeat="option in courselist" value="{{option.id}}" >{{option.first_name}} {{option.last_name}}</option>
               </select>
            <input type="submit" class="btn btn-primary btn-lg" value="Add Student" />
 </form>

我尝试过没有空白选项的选项,但是当我这样做时,模型不会在提交时发布,所以我添加了一个默认值:

<option value="" selected>Default</option>

但是当我提交表单时,选择的数组(courselist)被拼接并添加了一个空白选项以及上面的默认选项和剩余的courselist。

有没有办法只从courselist数组添加选项(没有角度空白),仍然可以发布它。

我试图发送默认设置 - &#34; sDefault&#34;但出于某种原因,这并没有传递给指令。

基本上我不需要默认选择,并且能够发布到表单,简单的你认为?!  ng-options是一个问题,因为它不是单个项目输出,即{{first_name}} {{last_name}},无论如何这也不会发布。

任何帮助表示赞赏。

更多信息:

感谢下面的Timcodes,我找到了问题的原因,但仍然没有解决方案。 Example working without $http

我给出的上述代码是为了避免大量的$ http。但我注意到使用带有api的真实版本会创建空白选择:

.controller("StudentController",function($scope,$http,$modal){
   $scope.studentlist = function() {
     $http.get('/api').
       success(function(data) {
          $scope.courselist = data;
        });
   };
   $scope.studentlist();
 });

$ scope.courselist输出     [{&#34;如first_name&#34;:&#34;米格尔&#34;&#34;姓氏&#34;:&#34;史密斯&#34;&#34; ID&#34; 10}]

如果我把它直接放入控制器:

$scope.courselist=[{"first_name":"Miguel","last_name":"Smith","id":10}]

它起作用,就像在plunker示例中一样,但是使用$ http它会创建一个空白的第一个选择选项。

解决方案:我决定将后端的courselist预加载到javascript变量而不是api中。这样,在创建selectedItem之前定义了列表。

我有兴趣听到角度解决方案。

1 个答案:

答案 0 :(得分:0)

您可以使用&#39; As&#39;用于连接两个要聚集的值的语法。例如ng-options =&#34; a as(a.first + a.last)in a alist&#34;。您也可以使用ng-model设置默认值。为此,将ng-model初始化为默认值,就像首次运行控制器时调用的激活函数一样。然后,在拼接数组后保持空白值不会出现,将ng-model重置为另一个值。例如,你可以有一个名为selectedCourse的模型然后将其设置为课程数组中的第一个课程,然后当你调用add函数时,在完成任何ansync之后,然后拼接数组。将所选项重置为课程数组中的第一个课程。像下面的东西,也有链接插件

// js
app.directive('thisView', function() {
   return {
     restrict:"E",
     scope: {
       students:"=",
       courselist:"=",
   },
   templateUrl: 'thisView.html',

   controller: function($scope) {

      //intialize selected course
      $scope.selectedCourse =  $scope.courselist[0];


      $scope.remStudent = function(remId) {
         $scope.students.splice( $.inArray(remId, $scope.students), 1 );
         $scope.courselist.push(data);//data will be returned from http not relevant for question
     };
     $scope.addStudent = function() {
       // pretending this is async op that returns a promise
      $scope.students.push(data).then(function(){

          var idx =  $scope.courselist.indexOf($scope.selectedCourse);     
          $scope.courselist.splice(idx,1);

          // reset slected course
          $scope.selectedCourse =  $scope.courselist[0];
       });     

     };     
   }
  }

  //html


   <form ng-submit="addStudent()">
      <select name="test"  
       ng-options=
       "course as (course.first_name + ' ' + course.last_name)
        for  course in courselist"
        ng-model="selectedCourse" >
     </select>
   <input type="submit" class="btn btn-primary btn-lg" value="Add Student" />
   </form>

https://docs.angularjs.org/api/ng/directive/ngOptions

http://plnkr.co/edit/7Hrv2E5DEgjn56wU0emO?p=preview