我创建了2个列表框,其中一个左侧有4个项目(例如),右侧则是空的。我在它们之间有2个按钮,可以从左向右移动内容,反之亦然。

我已经在angular js中实现了这一点。

现在的问题是,每次我在框之间来回移动元素时,它们总是附加在末尾,而我希望它们即使在框之间移动项目时也要保持排序顺序(字母顺序)。例如。我在左边有4种颜色,蓝色,绿色,红色,黄色。它们现在按字母顺序排列。我向左移动红色。然后,当我从右向右移动时,它会添加到列表的末尾,即列表现在是蓝色,绿色,黄色和红色,而预期结果是蓝色,绿色,红色,黄色。我已经在使用“ orderBy”,并且在第一次在UI上显示数据时就对数据进行排序,但是来回移动项不会保留排序顺序。

有没有办法在Angular中做到这一点?这是我的朋克

http://plnkr.co/edit/0KV9raBlgSuNT3mwKfWp?p=preview

我的指令中的代码如下:

app.directive('dualbox', function () {
    return {
        restrict: 'E',
        replace: true,
        scope: {
            title: '@',
            leftboxtitle: '@',
            rightboxtitle: '@',
            colors: '=ngModel'
        },
        templateUrl: 'dualboxTemplate.html',
        link: function (scope, element, attrs) {
            $('#add').click(function () {
                var selected = $('#select1 option:selected');
                angular.forEach(selected, function (value, key) {
                    scope.colors.destinationColors.push(value.text);
                });
                return !selected.remove().appendTo('#select2');
            });
            $('#remove').click(function () {
                var selected = $('#select2 option:selected');
                !selected.remove().appendTo('#select1');
                var currentSelect2List = $('#select2 option');
                scope.colors.oldDestinationColors = scope.colors.destinationColors;
                scope.colors.destinationColors = [];
                angular.forEach(currentSelect2List, function (value, key) {
                    scope.colors.destinationColors.push(value.text);
                });

                return
            });
            $("#selectAll").click(function () {
                $('select option').attr("selected", "selected");
            });
        }

    }

});


html模板中的代码是:

 <table cellpadding="0" cellspacing="0" border="0" height="144px;">
      <tbody>
        <tr>
          <td>
            <select name="disable" multiple="" id="select1" class="select1 tall" ng-model="selectedColor" ng-options="c.name for c in colors.sourceColors | orderBy:'name'"></select>
          </td>
          <td valign="top">

            <a  href="#" id="add">
              <img src="move_right.png" class="remove" />
            </a>
            <br />
            <a  href="#" id="remove">
              <img src="move_left.png" class="add" />
            </a>
          </td>
          <td>
            <select name="enable" id="select2" class="select2 tall" multiple="" size="2" ></select>
          </td>
        </tr>
        <tr>
          <td colspan="3">
            <div class="mar20Top mar10Btm flRt"></div>
          </td>
        </tr>
      </tbody>
    </table>


下面是我的控制器代码:

var app = angular.module('app', []);

app.controller('main', ['$scope',function($scope){
    $scope.colors = {sourceColors:[
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}

  ], destinationColors:[
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}

  ]};

  $scope.dummy=[{name:'rupa', age :"2"},
  {name:'sdfas', age :"2"},
  {name:'ruasdfapa', age :"2"},
  {name:'rusdfaspa', age :"2"}]

   $scope.items = [
    {"id":0,"name":"OG"},
    {"id":1,"name":"OS"},
    {"id":2,"name":"PG"},
    {"id":3,"name":"PS"}
  ];
  $scope.selectedItem=$scope.items[0];

}])


以下是我使用指令的html代码:

<!DOCTYPE html>
<html ng-app="app">

  <head>

    <script data-require="jquery@*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
     <script data-require="angular.js@*" data-semver="1.2.1" src="http://code.angularjs.org/1.2.1/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="myController.js"></script>
    <script src="customDirective.js"></script>
  </head>

  <body ng-controller="main">
    <div>
    Listbox Demo:
                 <dualbox title="ABC Listbox Directive" leftboxtitle="Disabled Profiles" rightboxtitle="Enabled Profiles" ng-model="colors"></dualbox>




                         lasdjflasdjfla
                         asdfjlasjl

                    <select novalidate="" class="select1 tall" ng-options="c.name for c in dummy"></select>
      <select novalidate="" ng-model="selectedItem" ng-options="item.name for item in items"></select>
    </div>
  </body>

</html>


感谢您的见解..对我的添加和删除功能进行了更改,从而达到了目的。基本上,不只是更新双盒子,解决方案是更新基础数据。将修补程序发布到此处,以便有相同问题的任何人都可以使用它。

 scope.add = function() {
            var selectedObjects = new Array();
            $('#select1 option:selected').each(function(){
                var selectedObject = scope.data.sourceColors[$(this).val()];
                selectedObjects.push(selectedObject);
                scope.data.destinationColors.push(selectedObject);
            });

            for(var i in selectedObjects){
                var idx = scope.data.sourceColors.indexOf(selectedObjects[i]);
                scope.data.sourceColors.splice(idx,1);
            }

        }

        //remove function
        scope.remove = function() {
            var selectedObjects = new Array();
            $('#select2 option:selected').each(function(){
                var selectedObject = scope.data.destinationColors[$(this).val()];
                selectedObjects.push(selectedObject);
                scope.data.sourceColors.push(selectedObject);
            });

            for(var i in selectedObjects){
                var idx = scope.data.destinationColors.indexOf(selectedObjects[i]);
                scope.data.destinationColors.splice(idx,1);
            }
        }

最佳答案

您可以像这样转换ng-options以应用排序/过滤:

ng-options="c as c.name for c in colors.sourceColors | orderBy:'name'"


当然在两个选择元素上都执行此操作,以便两个列表都以正确的顺序显示元素。

由于AngularJS的基本行为是“我的视图观察我的模型数据”,因此只需删除/添加模型中的元素,其余的工作就由视图完成。至少您应该以这种方式设计指令/应用程序。

10-04 22:04
查看更多