Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 按计算值进行角度排序_Angularjs_Sorting_Angularjs Directive - Fatal编程技术网

Angularjs 按计算值进行角度排序

Angularjs 按计算值进行角度排序,angularjs,sorting,angularjs-directive,Angularjs,Sorting,Angularjs Directive,我有一个应用程序,其中我显示一个元素列表,每个元素都有不同的属性,其中一个属性用于从工厂获取另一个值,我希望能够根据计算出的值对列表进行排序 我知道我可以将计算出的值保存在列表中,然后进行排序,但这是唯一的方法吗 这是我的密码 angular .module("app", []) .controller('Controller', Controller) .factory('factory', factory) .directive('val', val) .controll

我有一个应用程序,其中我显示一个元素列表,每个元素都有不同的属性,其中一个属性用于从工厂获取另一个值,我希望能够根据计算出的值对列表进行排序

我知道我可以将计算出的值保存在列表中,然后进行排序,但这是唯一的方法吗

这是我的密码

angular
  .module("app", [])
  .controller('Controller', Controller)
  .factory('factory', factory)
  .directive('val', val)
  .controller('ValController', ValController)

  DirectiveController.$inject = [ 'factory'];

function Controller() {
  var vm = this;

  vm.results = [{
    "id": "1",
    "pos": 1
  }, {
    "id": "2",
    "pos": 2
  }, {
    "id": "3",
    "pos": 3
  }, {
    "id": "4",
    "pos": 4
  }];

  console.info(JSON.stringify(vm.results));
}

function val() {
    return {
            replace: true,
            scope: {},
            bindToController: {
                id: '@'             
            },
            controller: ValController,
            controllerAs: 'vm',         
            template: '<td ng-bind="vm.value"></td>'
        };
}

function ValController(factory) {

    var vm = this;

  vm.value = factory.getValue(vm.id);
}

function factory() {

  var values = {
    '1': 'green',
    '2': 'blue',
    '3': 'yellow',
    '4': 'red'
  };

  return {
    getValue: function(id) {
      return values[id];
    }
  }
}
angular
.模块(“应用程序”,[])
.控制器(“控制器”,控制器)
.工厂(“工厂”,工厂)
.指令('val',val)
.controller('ValController',ValController)
DirectiveController.$inject=[“工厂”];
函数控制器(){
var vm=这个;
vm.results=[{
“id”:“1”,
“位置”:1
}, {
“id”:“2”,
“位置”:2
}, {
“id”:“3”,
“位置”:3
}, {
“id”:“4”,
“位置”:4
}];
info(JSON.stringify(vm.results));
}
函数val(){
返回{
替换:正确,
作用域:{},
bindToController:{
id:“@”
},
控制员:ValController,
controllerAs:'vm',
模板:“”
};
}
功能控制器(工厂){
var vm=这个;
vm.value=factory.getValue(vm.id);
}
函数工厂(){
var值={
“1”:“绿色”,
“2”:“蓝色”,
“3”:“黄色”,
“4”:“红色”
};
返回{
getValue:函数(id){
返回值[id];
}
}
}
和一个简单的html

<div>
  <table>
    <thead>
      <tr>
        <th>id</th>
        <th>pos</th>
        <th>value</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="result in vm.results | orderBy:'+value'">
        <td ng-bind="result.id"></td>
        <td ng-bind="result.pos"></td>
        <td val id="{{result.id}}"></td>
      </tr>
    </tbody>
  </table>
</div>

身份证件
销售时点情报系统
价值

非常感谢

对于这一点,由于属性值本身不是某种类型的反射,因此有很多方法可以做到这一点。除了使用另一个属性修改项目本身之外,所有项目都需要在一个地方或另一个地方进行排序

自定义过滤器很方便,因为您可以将工厂注入其中。由于过滤器用于数组,因此根据从工厂到项目的值映射返回排序数组

.filter('valueSort',function(factory){    
     return function(items){
        if(!items) return;
        return items.sort(function(a, b){
            return factory.values[a.pos] > factory.values[b.pos];
        });        
     }  
});
看法


注意:我调整了工厂以返回您的
对象引用以供演示


据我所知,此过滤器再次从工厂检索值,因此就效率而言,首先将值存储在我的项目中,然后像往常一样进行排序不是更快吗?没有实际的效率差异。工厂连接只不过是传递一个对象引用,而自定义过滤器的效率也不亚于orderBy,您仍然需要使用orderBy
<tr ng-repeat="result in vm.results | valueSort">