Hello 再次所有人。
编辑:我想强调一点,我找不到解决方案的文档。
我正在使用路由对我的服务器执行搜索查询。服务器执行所有数据逻辑等操作,并返回与给定关键字匹配的对象列表。我正在获取这些结果并将它们提供给模型,以便我可以使用{{#each}}帮助程序迭代每个结果。
我遇到的问题是,当searchText(搜索输入)发生变化时,模型会不想要刷新。我尝试过几件事。我并不担心创建太多的ajax请求,因为我的服务器在2ms内执行搜索查询。这就是我现在所拥有的。
App.SearchView = Ember.View.extend({...
感谢您的回答。
App.SearchView = Ember.View.extend({
didInsertElement: function () {
this._super();
Ember.run.scheduleOnce('afterRender', this, this.focusSearch);
},
focusSearch: function () {
$(".searchInput").focus().val(this.get("controller").get('searchTextI'));
}
});
App.SearchRoute = Ember.Route.extend({
model: function () {
return this.controllerFor('search').processSearch();
}
});
App.SearchController = Ember.ArrayController.extend({
searchTextI: null,
timeoutid: null,
processid: null,
updateSearch: function () {
if(this.get('timeoutid')) {clearTimeout(this.get('timeoutid')); }
var i = this.get('searchTextI');
var sc = this;
clearTimeout(this.get('processid'));
this.controllerFor('index').set('searchText', i); //set the search text on transition
if(i.length < 3) {
this.set('timeoutid', setTimeout(function () {
sc.controllerFor('index').set("transitioningFromSearch", true);
sc.transitionToRoute('index');
}, 1500));
} else {
var self = this;
this.set('processid', setTimeout(function() {
self.processSearch().then(function(result) {
self.set('content', result);
});
}, 1000));
}
}.observes('searchTextI'),
processSearch: function () {
return $.getJSON('http://api.*********/search', { 'token': guestToken, 'search_query': this.get('searchTextI') }).then(function(data) { if(data == "No Results Found.") { return []; } else { return data; } }).fail(function() { return ["ERROR."]; });
}
});
答案 0 :(得分:2)
不要观察路线中的任何内容,也不要定义任何计算属性。路线不适合这些。除此之外,model
不会触发,因为controller
未定义。
实现目标的一种方法:
App.SearchRoute = Ember.Route.extend({
model: function () {
this.controllerFor('search').searchQuery();
}.observes('controller.searchText') //not triggering an ajax request...
});
App.SearchController = Ember.ArrayController.extend({
searchQuery: function() {
return $.getJSON('http://api.**************/search', { 'token': guestToken, 'search_query': t }).fail(function() {
return null; //prevent error substate.
});
}
onSearchTextChange: function() {
var controller = this;
this.searchQuery().then(function(result) {
controller.set('content', result);
});
}.observes('searchText')
});
答案 1 :(得分:0)
在observes
挂钩上放置model
不会做任何事情。你应该简单地做你想做的事情并说出
processSearch: function () {
this.set('content', $.getJSON....);
}