Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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
Javascript 在控制器中实现角度滤波器的动态化_Javascript_Angularjs_Filter_Angularjs Ng Repeat_Angular Ngmodel - Fatal编程技术网

Javascript 在控制器中实现角度滤波器的动态化

Javascript 在控制器中实现角度滤波器的动态化,javascript,angularjs,filter,angularjs-ng-repeat,angular-ngmodel,Javascript,Angularjs,Filter,Angularjs Ng Repeat,Angular Ngmodel,我还看到过其他一些帖子,我认为这些帖子可能会有所帮助,但运气不好。当我静态地指定要使用什么属性进行过滤时,我有一个可以正常工作的过滤器。我正在构建一个角度组件,我不知道什么数据将实际传递到组件中。例如,以下是一些示例数据: this.customers = [ { name: 'Jim', city: 'Minneapolis', state: 'MN', zip: 44332 }, { name: 'Boe', city: 'Scottsdale', state: 'AZ', zip:

我还看到过其他一些帖子,我认为这些帖子可能会有所帮助,但运气不好。当我静态地指定要使用什么属性进行过滤时,我有一个可以正常工作的过滤器。我正在构建一个角度组件,我不知道什么数据将实际传递到组件中。例如,以下是一些示例数据:

this.customers = [
  { name: 'Jim', city: 'Minneapolis', state: 'MN', zip: 44332 },
  { name: 'Boe', city: 'Scottsdale', state: 'AZ', zip: 44332 },
  { name: 'Tom', city: 'S.F.', state: 'CA', zip: 11223 },
  { name: 'Joe', city: 'Dallas', state: 'TX', zip: 34543 },
  { name: 'Jon', city: 'L.A.', state: 'CA', zip: 56433 }
];
我的静态过滤器工作得很好:

public filterTextChangeLocal($event: ng.IAngularEvent) {
  if (this.itemDisplayProperty = "name") {
    this.filteredItems = this.$filter("filter")(this.items, {name: this.ngModelValue});
  } else if (this.itemDisplayProperty = "city") {
    this.filteredItems = this.$filter("filter")(this.items, {city: this.ngModelValue});
  } else if (this.itemDisplayProperty = "state") { 
    this.filteredItems = this.$filter("filter")(this.items, {state: this.ngModelValue});
  } else if (this.itemDisplayProperty === "zip") {
    this.filteredItems = this.$filter("filter")(this.items, {zip: this.ngModelValue});
  }
}
问题是组件的用户可能传入任何类型的数据,其属性可能完全不同,因此我需要一些可以解释任何指定属性的内容。我有一个名为itemDisplayProperty的隔离作用域属性,它允许用户从他们的数据中指定要在下拉列表中显示的属性,这就是我需要筛选的属性。他们可以说,item display property=address,address属性中的数据将显示在下拉列表中。我尝试了此操作,但不起作用。不允许使用此单词:

this.filteredItems = this.$filter("filter")(this.items, {
  this.itemDisplayProperty : this.ngModelValue
});
以下是我的输入和下拉列表供参考:

<input type="text" class="form-control" 
       ng-change="ctrl.filterTextChangeLocal($event)" 
       ng-model="ctrl.ngModelValue" 
       ng-click="ctrl.openDropdown($event)" />

<ul class="dropdown-menu list-group" ng-if="!ctrl.ngDisabled">
  <li class="list-group-item" 
      ng-repeat="row in ctrl.filteredItems" 
      ng-mousedown="ctrl.onSelectedLocal(row, $event)">

    {{row[ctrl.itemDisplayProperty]}}
  </li>
</ul>
为了重构filterTextChangeLocal中的静态过滤器,您需要做的就是构造一个带有动态键的$filter表达式

这可以通过使用所谓的:

重构后的filterTextChangeLocal将如下所示:

public filterTextChangeLocal($event: ng.IAngularEvent) {
    var filterExpression = {};
    filterExpression[this.itemDisplayProperty] = this.ngModelValue;

    this.filteredItems = this.$filter("filter")(this.items, filterExpression);
}

我用这种方式解决了自己的问题,这似乎是一种在对象内部使用变量的新ES6方式。有标记的答案也同样有效:

 this.filteredItems = this.$filter("filter")(this.items, {[this.itemDisplayProperty] : this.ngModelValue});

好的,没错,在ES6中,你可以使用计算出的比例

使用ES5,您可以使用var self=this创建这样的过滤器对象;在控制器中:

var filterObj = {};
filterObj[self.itemDisplayProperty] = self.ngModelValue;
self.filteredItems = $filter("filter")(self.items, filterObj);
请看下面的演示或这个

只需注意变量名。避免在姓名中使用ng前缀,例如在代码中使用ngDisabled。因为这个变量与AngularJs无关,不同的名称将使代码更具可读性。像showDrop这样的东西会更好

角度。模块'demoApp',[] .controller'mainController',mainController .指令'dynFilter',dynFilter指令; 函数DynFilterDirective$filter{ 返回{ 限制:'E', controllerAs:'ctrl', templateUrl:'components/dynFilterTempl.html', bindToController:{ 项目:“=”, itemDisplayProperty:“=” }, 作用域:{}, 控制器:功能{ var self=这个; self.filterTextChangeLocal=函数$event{ var filterObj={}; filterObj[self.itemDisplayProperty]=self.ngModelValue; console.logfilterbj; self.filteredItems=$filterfilterself.items,filterObj; }; } } } 函数main控制器$filter{ var vm=这个; vm.items=[ {姓名:'Jim',城市:'Minneapolis',州:'MN',邮编:44332}, {名称:'Boe',城市:'Scottsdale',州:'AZ',邮编:44332}, {姓名:'Tom',城市:'S.F.,州:'CA',邮编:11223}, {姓名:'Joe',城市:'Dallas',州:'TX',邮编:34543}, {姓名:'Jon',城市:'L.A.,州:'CA',邮编:56433}, ]; vm.keys=Object.keysvm.items[0]; vm.curProp=vm.keys[0]; } {{Object.keysmainCtrl.items[0]} 选择您的过滤器: {{row[ctrl.itemDisplayProperty]}
谢谢Cosmin,在刷新和查看您的帖子之前,我为自己的问题添加了一个答案。这基本上是相同的想法,也会非常有效。我会记下答案。感谢您的时间。我将其添加到我的项目中,并且工作正常…谢谢:
var filterObj = {};
filterObj[self.itemDisplayProperty] = self.ngModelValue;
self.filteredItems = $filter("filter")(self.items, filterObj);