2017-09-05 93 views
3

指导我采用了棱角分明1.6.5有一个问题,尝试了一切,但没有任何明显的进展......AngularJS与选择

我提出了实现HTML SELECT标签的指令,分量似乎工作,直到我尝试获取option value属性中的整个对象而不是单个值或ID。 我可以输出选项标签的文本作为对象的属性或通过函数返回一些字符串。

这是一个完整的组件和问题的小提琴。 有3个例子:

  1. 首届一个似乎正常工作,它打印正确的文本,并返回正确的值

  2. 第2:不工作,我想设置成整个OBJECT的模型选择,而不是一个属性

  3. 第三:不工作,我想设置到模型的整个OBJECT选择,而不是一个属性,但它正确打印父函数中的文本控制器。

我怎样才能改变我的组件,它可以同时返回一个属性(如ID)把全部对象(JSON格式是好的)?

angular.module("myApp", ['customDrop']).controller("TestController", ['$scope', function($scope) { 
 
    var ITEM_SELECTED = { 
 
    ID: 3, 
 
    VALUE: "VALUE3" 
 
    }; 
 
    $scope.LIST = [{ 
 
     ID: 1, 
 
     VALUE: "VALUE1" 
 
    }, 
 
    { 
 
     ID: 2, 
 
     VALUE: "VALUE2" 
 
    }, 
 
    ITEM_SELECTED, 
 
    ]; 
 

 
    $scope.OBJ = { 
 
    LOTTO1: ITEM_SELECTED, 
 
    LOTTO2: ITEM_SELECTED, 
 
    LOTTO3: ITEM_SELECTED 
 

 
    }; 
 

 
    $scope.getCompleteValue = function(obj) { 
 
    return obj.ID + " - " + obj.VALUE; 
 
    } 
 
}]); 
 

 
angular.module('customDrop', []).directive('customDrop', function() { 
 
    return { 
 
    restrict: 'E', 
 
    scope: { 
 
     dropid: '@', 
 
     dropvalue: '&', 
 
     list: '=', 
 
     ngModel: '=' 
 
    }, 
 
    require: 'ngModel', 
 
    template: '<select class="drop" ng-model="ngModel">' + 
 
     '<option ng-repeat="val in list" value="{{getId(val)}}">{{getValue(val)}}</option>' + 
 
     '</select>', 
 
    controller: ['$scope', '$parse', '$timeout', 
 
     function($scope, $parse, $timeout) { 
 
     $scope.getId = function(obj) { 
 
      return obj[$scope.dropid]; 
 
     } 
 

 
     // Can print text option as proerty of through function in parent scope. 
 
     $scope.getValue = function(obj) { 
 
      return !angular.isFunction($scope.dropvalue(obj)) ? 
 
      $scope.dropvalue(obj) : 
 
      $parse($scope.dropvalue(obj))(obj); 
 
     } 
 
     } 
 
    ] 
 
    } 
 
});
.drop { 
 
    width: 400px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.min.js"></script> 
 
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
 

 

 
<div ng-app="myApp" ng-controller="TestController"> 
 
    <strong>Simple Text Property (drop id intended to return the ID): (working)</strong><br> 
 
    <custom-drop dropvalue="VALUE" dropid="ID" list="LIST" ng-model="OBJ.LOTTO1"></custom-drop><br> Selected Value: {{OBJ.LOTTO1}} 
 
    <br><br><br> 
 
    <!-- using property as dropValue --> 
 
    <strong>Simple Text Property (drop id intended to return an object): (not working)</strong><br> 
 
    <custom-drop dropvalue="VALUE" dropid="" list="LIST" ng-model="OBJ.LOTTO2"></custom-drop><br> Selected Value: {{OBJ.LOTTO2}} 
 
    <br><br><br> 
 
    <!-- using function as dropValue --> 
 
    <strong>Function Text Property: (not working)</strong><br> 
 
    <custom-drop dropvalue="getCompleteValue" dropid="" list="LIST" ng-model="OBJ.LOTTO3"></custom-drop><br> Selected Value: {{OBJ.LOTTO3}} 
 
</div>

+0

becide你的问题,所以很多问题在这里 - 甚至不包括jQuery的,喜欢组件,不使用额外的ngModel,不要在模板中使用的方法,喜欢纳克-options ...最后 - 不要编写这样的组件 - 它会花费你的时间来使其可行。 (即在这个实现中,你不能添加验证器到字段) –

回答

1

要设置到整个对象中选择你要修改getId()方法返回的情况下,$scope.dropid不是通过绑定传递的对象(因为使用这种方法的模型生成option的值)。另外我建议使用ngOptions来生成option元素的列表。请参见下面的代码片段:

angular.module("myApp", ['customDrop']).controller("TestController", ['$scope', function ($scope) { 
 
    var ITEM_SELECTED = { 
 
     ID: 3, 
 
     VALUE: "VALUE3" 
 
    }; 
 
    $scope.LIST = [{ 
 
     ID: 1, 
 
     VALUE: "VALUE1" 
 
    }, 
 
     { 
 
      ID: 2, 
 
      VALUE: "VALUE2" 
 
     }, 
 
     ITEM_SELECTED, 
 
    ]; 
 

 
    $scope.OBJ = { 
 
     LOTTO1: ITEM_SELECTED.ID, 
 
     LOTTO2: ITEM_SELECTED, 
 
     LOTTO3: ITEM_SELECTED 
 

 
    }; 
 

 
    $scope.getCompleteValue = function (obj) { 
 
     return obj.ID + " - " + obj.VALUE; 
 
    } 
 
}]); 
 

 
angular.module('customDrop', []).directive('customDrop', function() { 
 
    return { 
 
     restrict: 'E', 
 
     scope: { 
 
      dropid: '@', 
 
      dropvalue: '&', 
 
      list: '<', 
 
      ngModel: '=' 
 
     }, 
 
     require: 'ngModel', 
 
     template: '<select class="drop" ng-model="ngModel" ng-options="getModelValue(val) as getOptionText(val) for val in list"></select>', 
 
     controller: ['$scope', '$parse', 
 
      function ($scope, $parse) { 
 
       $scope.getModelValue = function (obj) { 
 
        return !!$scope.dropid ? obj[$scope.dropid] : obj; 
 
       }; 
 

 
       $scope.getOptionText = function (obj) { 
 
        return !angular.isFunction($scope.dropvalue(obj)) ? 
 
         $scope.dropvalue(obj) : 
 
         $parse($scope.dropvalue(obj))(obj); 
 
       } 
 
      } 
 
     ] 
 
    } 
 
});
.drop { 
 
    width: 400px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.min.js"></script> 
 

 
<div ng-app="myApp" ng-controller="TestController"> 
 
    <strong>Simple Text Property (drop id intended to return the ID): </strong><br> 
 
    <custom-drop dropvalue="VALUE" dropid="ID" list="LIST" ng-model="OBJ.LOTTO1"></custom-drop><br> Selected Value: {{OBJ.LOTTO1}} 
 
    <br><br><br> 
 
    <!-- using property as dropValue --> 
 
    <strong>Simple Text Property (drop id intended to return an object): </strong><br> 
 
    <custom-drop dropvalue="VALUE" dropid="" list="LIST" ng-model="OBJ.LOTTO2"></custom-drop><br> Selected Value: {{OBJ.LOTTO2}} 
 
    <br><br><br> 
 
    <!-- using function as dropValue --> 
 
    <strong>Function Text Property: </strong><br> 
 
    <custom-drop dropvalue="getCompleteValue" dropid="" list="LIST" ng-model="OBJ.LOTTO3"></custom-drop><br> Selected Value: {{OBJ.LOTTO3}} 
 
</div>

+0

谢谢..它的作品无瑕疵...... :) – Marcx

+0

@Marcx很高兴它帮助你:) –