EmberJS:刷新模特?

时间:2014-01-17 20:56:04

标签: javascript ember.js

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."]; });
    }
});

2 个答案:

答案 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....);
}