我正在尝试将ember-model与ember-table相关联,以从服务器中提取分页记录,并在向下滚动时将它们添加到表中.
我可以通过在http://addepar.github.io/ember-table/的ajax示例中请求我的api url的页面号来获得它的工作,但是我不能弄清楚如何将它与ember-model集成以创建和删除对象,然后将它们添加到表中.
这是我的代码,只是做一个ajax请求并添加到表.任何人都可以告诉我如何改变这个,以使用ember-model / ember-data.
App.TableAjaxExample = Ember.Namespace.create() App.TableAjaxExample.LazyDataSource = Ember.ArrayProxy.extend createGithubEvent: (row,event) -> row.set 'id',event.id row.set 'name',event.name row.set 'isLoaded',yes requestGithubEvent: (page) -> content = @get 'content' start = (page - 1) * 30 end = start + 30 per_page = 40 # something like this ??? #App.Detail.find(type: 'companies',page: page,per_page: per_page).on 'didLoad',-> url = "http:/myurl.dev/admin/details.json?type=companies&page=#{page}&per_page=30" Ember.$.getJSON url,(json) => json.details.forEach (event,index) => row = content[start + index] @createGithubEvent row,event [start...end].forEach (index) -> content[index] = Ember.Object.create eventId: index,isLoaded: no objectAt: (index) -> content = @get 'content' #if index is content.get('length') - 1 # content.pushObjects(new Array(30)) row = content[index] return row if row and not row.get('error') @requestGithubEvent Math.floor(index / 30 + 1) content[index] App.TableAjaxExample.TableController = Ember.Table.TableController.extend hasHeader: yes hasFooter: no numFixedColumns: 0 numRows: 21054 rowHeight: 35 columns: Ember.computed -> columnNames = ['id','name'] columns = columnNames.map (key,index) -> Ember.Table.ColumnDefinition.create columnWidth: 150 headerCellName: key.w() contentPath: key columns .property() content: Ember.computed -> App.TableAjaxExample.LazyDataSource.create content: new Array(@get('numRows')) .property 'numRows'
这是可能的还是这样慢下来呢?
谢谢您的帮助.
干草堆
解决方法
这是一个JSBin,我使用了Ember Data和RESTAdapter:
http://jsbin.com/eVOgUrE/3/edit
它与AJAX加载示例非常相似,但使用Ember Data加载数据.我创建了一个RowProxy对象,它立即返回到Ember Table,以便它可以呈现一行.在Ember Data加载完整数据的页面之后,它将在RowProxy中设置对象属性来更新视图.
window.App = Ember.Application.create(); // The main model that will be loaded into Ember Table App.Gallery = DS.Model.extend({ name: DS.attr('string'),smallUrl: DS.attr('string') }); // This is a temporary buffer object that sits between // Ember Table and the model object (Gallery,in this case). App.RowProxy = Ember.Object.extend({ object:null,getObjectProperty : function(prop){ var obj = this.get('object'); if(obj){ console.log(prop + " : " + obj.get(prop)); } return obj ? obj.get(prop) : 'loading...'; },isLoaded : function(){ return !!this.get('object'); }.property('object'),name : function(){ return this.getObjectProperty('name'); }.property('object.name'),id : function(){ return this.getObjectProperty('id'); }.property('object.id'),smallUrl : function(){ return this.getObjectProperty('smallUrl'); }.property('object.smallUrl') }); App.ApplicationController = Ember.Controller.extend({ tableController: Ember.computed(function() { return Ember.get('App.TableAjaxExample.TableController').create({ // We need to pass in the store so that the table can use it store : this.get('store') }); }) }); App.TableAjaxExample = Ember.Namespace.create(); App.TableAjaxExample.ImageTableCell = Ember.Table.TableCell.extend({ templateName: 'img-table-cell',classNames: 'img-table-cell' }); App.TableAjaxExample.LazyDataSource = Ember.ArrayProxy.extend({ requestPage : function(page){ var content,end,start,url,_i,_results,_this = this; content = this.get('content'); start = (page - 1) * 3; end = start + 3; // Find galleries and then update the RowProxy to hold a gallery as 'object' this.get('store').find('gallery',{page_size:3,page:page}).then(function(galleries){ return galleries.forEach(function(gallery,index) { var position = start + index; content[position].set('object',gallery); }); }); // Fill the 'content' array with RowProxy objects // Taken from the 'requestGithubEvent' method of the original example return (function() { _results = []; for (var _i = start; start <= end ? _i < end : _i > end; start <= end ? _i++ : _i--){ _results.push(_i); } return _results; }).apply(this).forEach(function(index) { return content[index] = App.RowProxy.create({ index: index }); }); },objectAt: function(index) { var content,row; content = this.get('content'); row = content[index]; if (row && !row.get('error')) { return row; } this.requestPage(Math.floor(index / 3 + 1)); return content[index]; } }); App.TableAjaxExample.TableController = Ember.Table.TableController.extend({ hasHeader: true,hasFooter: false,numFixedColumns: 0,numRows: 19,rowHeight: 35,columns: Ember.computed(function() { var avatar,columnNames,columns; avatar = Ember.Table.ColumnDefinition.create({ columnWidth: 80,headerCellName: 'smallUrl',tableCellViewClass: 'App.TableAjaxExample.ImageTableCell',contentPath: 'smallUrl' }); columnNames = ['id','name']; columns = columnNames.map(function(key,index) { return Ember.Table.ColumnDefinition.create({ columnWidth: 150,headerCellName: key.w(),contentPath: key }); }); columns.unshift(avatar); return columns; }).property(),content: Ember.computed(function() { return App.TableAjaxExample.LazyDataSource.create({ content: new Array(this.get('numRows')),store : this.get('store') }); }).property('numRows') }); App.ApplicationAdapter = DS.RESTAdapter.extend({ host: 'http://files.cloudhdr.com/api/v1/public',// This is here to use underscores in API params pathForType: function(type) { var underscored = Ember.String.underscore(type); return Ember.String.pluralize(underscored); } }); // Everything below is all here to use underscores in API params. // You may or may not need this. DS.RESTSerializer.reopen({ modelTypeFromRoot: function(root) { console.log("modelTypeFromRoot " + root); var camelized = Ember.String.camelize(root); return Ember.String.singularize(camelized); } }); App.ApplicationSerializer = DS.RESTSerializer.extend({ normalize: function(type,hash,property) { var normalized = {},normalizedProp; for (var prop in hash) { if (prop.substr(-3) === '_id') { // belongsTo relationships normalizedProp = prop.slice(0,-3); } else if (prop.substr(-4) === '_ids') { // hasMany relationship normalizedProp = Ember.String.pluralize(prop.slice(0,-4)); } else { // regualarAttribute normalizedProp = prop; } normalizedProp = Ember.String.camelize(normalizedProp); normalized[normalizedProp] = hash[prop]; } return this._super(type,normalized,property); } });