store.filter() работает не так, как ожидалось ember.js (Попытка поиска моделей)

#javascript #ember.js

#javascript #ember.js

Вопрос:

Я пытаюсь внедрить здесь систему поиска, и у меня возникли некоторые проблемы с store.filter()

Прежде всего, я не могу найти никакой хорошей документации по store.filter() методу, кроме here: http://emberjs.com/guides/models/frequently-asked-questions /

Поэтому я использую пример, приведенный на этой странице, в качестве ориентира.

Это то, что у меня есть в моем коде

 App.ApplicationController = Ember.ObjectController.extend({
    isDropdown: false,
    actions: {
        handle_search: function() {
            var search_text = this.get('search_text');
            if (search_text) {
                this.set('isDropdown', true);
                return this.store.filter('procedure', {proc_name: search_text}, function(procedure) {
                    console.log(procedure);
                });
            }
        }
    }
});
  

но когда я регистрирую то, что возвращается, оно возвращает в основном каждую отдельную модель. Вместо отсутствия результатов или ограниченного количества результатов.

Кроме того procedure , он сам не является объектом модели, это что-то другое.

Итак, мой вопрос в том, как мне получить фактическую модель с полями и как я могу гарантировать, что хранилище действительно фильтрует результаты?

Комментарии:

1. проверьте документацию здесь github.com/emberjs/data/blob/master/packages/ember-data/lib /. … В качестве примечания, действительно, журнал будет регистрировать все, вам нужно вернуть ‘true’ для записей, которые вы хотите вернуть в этом фильтре. Проверьте документы, я уверен, что вы сможете сделать это после этого.

Ответ №1:

Вам просто нужно передать функцию, которая возвращает true / false для включения записи

 App.IndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.filter('color', function(item){
      return item.get('color')=='red';
    });
  }
});
  

http://emberjs.jsbin.com/OxIDiVU/647/edit

Если вы хотите одновременно выполнить обратный вызов серверу (поиск по запросу), вы включаете необязательный параметр запроса, приведенный ниже пример вызовет /colors?color=green

 App.IndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.filter('color', {color:'green'}, function(item){
      return item.get('color')=='red';
    });
  }
});

/**
    Takes a type and filter function, and returns a live RecordArray that
    remains up to date as new records are loaded into the store or created
    locally.

    The callback function takes a materialized record, and returns true
    if the record should be included in the filter and false if it should
    not.

    The filter function is called once on all records for the type when
    it is created, and then once on each newly loaded or created record.

    If any of a record's properties change, or if it changes state, the
    filter function will be invoked again to determine whether it should
    still be in the array.

    Optionally you can pass a query which will be triggered at first. The
    results returned by the server could then appear in the filter if they
    match the filter function.

    Example

    ```javascript
    store.filter('post', {unread: true}, function(post) {
      return post.get('unread');
    }).then(function(unreadPosts) {
      unreadPosts.get('length'); // 5
      var unreadPost = unreadPosts.objectAt(0);
      unreadPost.set('unread', false);
      unreadPosts.get('length'); // 4
    });
    ```

    @method filter
    @param {String or subclass of DS.Model} type
    @param {Object} query optional query
    @param {Function} filter
    @return {DS.PromiseArray}
  */
  

Комментарии:

1. Я немного смущен. Первый параметр для фильтрации — это имя модели или поле, по которому вы хотите отфильтровать?

2. первый параметр — это тип модели, он соотносится с App.Color

3. документация добавлена выше.

4. В настоящее время он выполняет точное совпадение, возможно ли, чтобы он выполнял случайное совпадение и получал все подобные результаты? Кроме того, как я могу на самом деле увидеть, какие модели он возвращает в консоли?

5. Вместо этого я использовал indexOf .