#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 .