2

我是从 Ember.JS 开始的,但我想我给自己提出了一个很好的问题。我在左侧有一个工作列表,在右侧有一个搜索字段。因此,在 KeyUp 事件中,我将文本字段的值发送到模型,以查找匹配项,如下所示:

this.controllerFor('productImages').set('model', App.ProductImage.find({ean_codes: value}));

我的问题是,是否可以使用某种正则表达式找到匹配项,例如如果我有 ID 1234,即使我只搜索“1”,它也会找到它?

4

2 回答 2

4

根据有关查询的Ember Data 文档:

您可以通过将哈希传递给 find() 来查询服务器。

哈希的内容对 Ember Data 是不透明的;由您的服务器来解释它并返回记录列表。

如果您想要客户端过滤,您可以filter()使用Ember.Array. 此示例显示包含原始数组内容子集的计算属性。此计算数组仅显示与输入框中的内容相匹配的项目。

JSBin 示例

Javascript:

App = Ember.Application.create({});

App.IndexRoute = Ember.Route.extend({
  setupController: function(controller) {
    controller.set('content', [
      Ember.Object.create({name: 'Joe'}), 
      Ember.Object.create({name: 'Frank'}), 
      Ember.Object.create({name: 'John'}),
      Ember.Object.create({name: 'Billy'}),
      Ember.Object.create({name: 'John'}),
      Ember.Object.create({name: 'Johnny'})
    ]);
  }
});

App.IndexController = Ember.ArrayController.extend({
  content: [],
  filter: "",
  filteredContent: function() {
    var filter = this.get('filter');

    return this.get('content').filter(function(item, index, enumerable){
      return item.get('name').toLowerCase().match(filter.toLowerCase());
    });
  }.property('filter', 'content.@each')

});

车把:

<script type="text/x-handlebars" data-template-name="index">
  <h2>Index Content:</h2>
  <span>Filter: </span>{{view Ember.TextField valueBinding=filter}}
  <ul>
  {{#each item in filteredContent}}
      <li>{{item.name}}</li>
  {{/each}}
   </ul>
</script>
于 2013-03-14T20:44:08.590 回答
2

Ember-Data 的过滤记录数组可能非常适合。通过使用store.filter代替,store.find您可以返回过滤客户端的实时记录数组。

要过滤已加载的记录,请使用:

this.controllerFor('productImages').set('model', App.ProductImage.filter(function(hash) {
  if (hash.get('id').match(/1/)) { return true; }
});

如果您还需要启动查询,请将查询参数(或空哈希)作为第一个参数添加到 filter 方法:

this.controllerFor('productImages').set('model', App.ProductImage.filter({}, function(hash) {
  if (hash.get('id').match(/1/)) { return true; }
});

目前还没有这方面的文档/指南,因此学习它的最佳地点是通过 ember-data 测试。以下是一个很好的起点:

于 2013-03-14T22:23:37.713 回答