每当有Ember-Model的新记录时更新视图

时间:2013-10-21 19:50:33

标签: javascript ember.js ember-model

我有一个简单的Ember.js应用程序。有一个application view,在该视图中有一个results view

我正在使用ember-model从服务器获取JSON:

Map.Winery = Ember.Model.extend({
    name:          Ember.attr(),
    address:       Ember.attr(),
    address_2:     Ember.attr(),
    city:          Ember.attr(),
    stateprovince: Ember.attr(),
    country:       Ember.attr(),
    latitude:      Ember.attr(),
    longitude:     Ember.attr(),

    full_address: function () {
        return this.get('address') + ' ' + this.get('city') + ' ' + this.get('stateprovince') + ' ' + this.get('country');
    }.observes('address', 'city', 'stateprovince', 'country')
});

Map.Winery.adapter = Ember.Adapter.create({
    findAll: function(klass, records) {
        return Ember.$.getJSON('/api/wineries').then(function(response) {
            if (response.success) {
                records.load(klass, response.data);
            }
        });
    }
});

我尽可能简单,以便人们可以公平地看看发生了什么。

基本上,我的应用程序视图中有一个按钮,每当我点击时,调用一个调用Map.Winery.findAll()的动作; (从服务器重新加载数据)。

我想要的是,只要记录中加载了新数据,results view就应该使用新结果进行更新。

application.hbs

<button class="locate" {{action "reload" on="click"}}>Reload</button>
{{view Map.ResultsView}}

application_controller.js

Map.ApplicationController = Ember.ObjectController.extend({
    actions: {
        reload: function() {
            var results = Map.Winery.findAll();
        }
    }
});

results.hbs

<div class="results">
    {{#each results}}
        <p>{{this}}</p>
    {{/each}}
</div>

results_view.js

Map.ResultsView = Ember.View.extend({
    templateName: 'results',

    didInsertElement: function(e) {
    }

});

现在的问题是:如果从服务器向记录加载新数据,结果视图是否会更新,我该怎么做呢?

我尝试插入尽可能多的相关代码,随时提出任何问题。

由于

2 个答案:

答案 0 :(得分:0)

只需将新对象推入集合(或使用findAll中的新集合替换集合)。

http://emberjs.jsbin.com/EFiTOtu/1/edit

App.IndexController = Em.ArrayController.extend({
  actions: {
    addNewColor: function(){
      this.get('model').pushObject(this.get('newColor'));
    }
  }
});

答案 1 :(得分:0)

我发现的最佳方法是将事件添加到我需要触发的任何内容中,并在需要时使用该触发器。

使用Ember.Evented

App.ApplicationController = Ember.ObjectController.extend(Ember.Evented, {
    viewUpdated: function(args) {} 
    /* controller stuff here */ 
});

我现在几乎可以在任何地方添加这样的事件:

this.get('controller').on('viewUpdated', $.proxy(this.viewUpdated, this));

所以每当我必须触发视图进行更新时,我都会这样做:

this.get('controllers.application').trigger('viewUpdated', args);

(顺便说一下,args是可选的)

这样,只要我愿意,就会触发事件。它没有观察者那么强大,但仍能很好地完成工作!