ember.js – Ember-table与Ember-model / Ember-data的集成

前端之家收集整理的这篇文章主要介绍了ember.js – Ember-table与Ember-model / Ember-data的集成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将ember-model与ember-table相关联,以从服务器中提取分页记录,并在向下滚动时将它们添加到表中.

我可以通过在http://addepar.github.io/ember-table/的ajax示例中请求我的api url的页面号来获得它的工作,但是我不能弄清楚如何将它与ember-model集成以创建和删除对象,然后将它们添加到表中.

这是我的代码,只是做一个ajax请求并添加到表.任何人都可以告诉我如何改变这个,以使用ember-model / ember-data.

  1. App.TableAjaxExample = Ember.Namespace.create()
  2.  
  3. App.TableAjaxExample.LazyDataSource = Ember.ArrayProxy.extend
  4.  
  5. createGithubEvent: (row,event) ->
  6.  
  7. row.set 'id',event.id
  8. row.set 'name',event.name
  9. row.set 'isLoaded',yes
  10.  
  11. requestGithubEvent: (page) ->
  12.  
  13. content = @get 'content'
  14. start = (page - 1) * 30
  15. end = start + 30
  16. per_page = 40
  17. # something like this ???
  18. #App.Detail.find(type: 'companies',page: page,per_page: per_page).on 'didLoad',->
  19. url = "http:/myurl.dev/admin/details.json?type=companies&page=#{page}&per_page=30"
  20. Ember.$.getJSON url,(json) =>
  21. json.details.forEach (event,index) =>
  22. row = content[start + index]
  23. @createGithubEvent row,event
  24. [start...end].forEach (index) ->
  25. content[index] = Ember.Object.create eventId: index,isLoaded: no
  26.  
  27. objectAt: (index) ->
  28.  
  29. content = @get 'content'
  30. #if index is content.get('length') - 1
  31. # content.pushObjects(new Array(30))
  32. row = content[index]
  33. return row if row and not row.get('error')
  34. @requestGithubEvent Math.floor(index / 30 + 1)
  35. content[index]
  36.  
  37. App.TableAjaxExample.TableController =
  38. Ember.Table.TableController.extend
  39.  
  40. hasHeader: yes
  41. hasFooter: no
  42. numFixedColumns: 0
  43. numRows: 21054
  44. rowHeight: 35
  45.  
  46. columns: Ember.computed ->
  47.  
  48. columnNames = ['id','name']
  49. columns = columnNames.map (key,index) ->
  50. Ember.Table.ColumnDefinition.create
  51. columnWidth: 150
  52. headerCellName: key.w()
  53. contentPath: key
  54.  
  55. columns
  56. .property()
  57.  
  58. content: Ember.computed ->
  59. App.TableAjaxExample.LazyDataSource.create
  60.  
  61. content: new Array(@get('numRows'))
  62. .property 'numRows'

这是可能的还是这样慢下来呢?

谢谢您的帮助.
干草堆

解决方法

这是一个JSBin,我使用了Ember Data和RESTAdapter: http://jsbin.com/eVOgUrE/3/edit

它与AJAX加载示例非常相似,但使用Ember Data加载数据.我创建了一个RowProxy对象,它立即返回到Ember Table,以便它可以呈现一行.在Ember Data加载完整数据的页面之后,它将在RowProxy中设置对象属性来更新视图.

  1. window.App = Ember.Application.create();
  2.  
  3. // The main model that will be loaded into Ember Table
  4. App.Gallery = DS.Model.extend({
  5. name: DS.attr('string'),smallUrl: DS.attr('string')
  6. });
  7.  
  8. // This is a temporary buffer object that sits between
  9. // Ember Table and the model object (Gallery,in this case).
  10. App.RowProxy = Ember.Object.extend({
  11. object:null,getObjectProperty : function(prop){
  12. var obj = this.get('object');
  13. if(obj){ console.log(prop + " : " + obj.get(prop)); }
  14. return obj ? obj.get(prop) : 'loading...';
  15. },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')
  16. });
  17.  
  18. App.ApplicationController = Ember.Controller.extend({
  19. tableController: Ember.computed(function() {
  20. return Ember.get('App.TableAjaxExample.TableController').create({
  21. // We need to pass in the store so that the table can use it
  22. store : this.get('store')
  23. });
  24. })
  25. });
  26.  
  27. App.TableAjaxExample = Ember.Namespace.create();
  28.  
  29. App.TableAjaxExample.ImageTableCell = Ember.Table.TableCell.extend({
  30. templateName: 'img-table-cell',classNames: 'img-table-cell'
  31. });
  32.  
  33. App.TableAjaxExample.LazyDataSource = Ember.ArrayProxy.extend({
  34. requestPage : function(page){
  35. var content,end,start,url,_i,_results,_this = this;
  36.  
  37. content = this.get('content');
  38. start = (page - 1) * 3;
  39. end = start + 3;
  40.  
  41. // Find galleries and then update the RowProxy to hold a gallery as 'object'
  42. this.get('store').find('gallery',{page_size:3,page:page}).then(function(galleries){
  43. return galleries.forEach(function(gallery,index) {
  44. var position = start + index;
  45. content[position].set('object',gallery);
  46. });
  47. });
  48.  
  49. // Fill the 'content' array with RowProxy objects
  50. // Taken from the 'requestGithubEvent' method of the original example
  51. return (function() {
  52. _results = [];
  53. for (var _i = start; start <= end ? _i < end : _i > end; start <= end ? _i++ : _i--){ _results.push(_i); }
  54. return _results;
  55. }).apply(this).forEach(function(index) {
  56. return content[index] = App.RowProxy.create({
  57. index: index
  58. });
  59. });
  60. },objectAt: function(index) {
  61. var content,row;
  62. content = this.get('content');
  63. row = content[index];
  64. if (row && !row.get('error')) {
  65. return row;
  66. }
  67. this.requestPage(Math.floor(index / 3 + 1));
  68. return content[index];
  69. }
  70. });
  71.  
  72. App.TableAjaxExample.TableController = Ember.Table.TableController.extend({
  73. hasHeader: true,hasFooter: false,numFixedColumns: 0,numRows: 19,rowHeight: 35,columns: Ember.computed(function() {
  74. var avatar,columnNames,columns;
  75.  
  76. avatar = Ember.Table.ColumnDefinition.create({
  77. columnWidth: 80,headerCellName: 'smallUrl',tableCellViewClass: 'App.TableAjaxExample.ImageTableCell',contentPath: 'smallUrl'
  78. });
  79. columnNames = ['id','name'];
  80. columns = columnNames.map(function(key,index) {
  81. return Ember.Table.ColumnDefinition.create({
  82. columnWidth: 150,headerCellName: key.w(),contentPath: key
  83. });
  84. });
  85. columns.unshift(avatar);
  86. return columns;
  87. }).property(),content: Ember.computed(function() {
  88. return App.TableAjaxExample.LazyDataSource.create({
  89. content: new Array(this.get('numRows')),store : this.get('store')
  90. });
  91. }).property('numRows')
  92. });
  93.  
  94.  
  95. App.ApplicationAdapter = DS.RESTAdapter.extend({
  96. host: 'http://files.cloudhdr.com/api/v1/public',// This is here to use underscores in API params
  97. pathForType: function(type) {
  98. var underscored = Ember.String.underscore(type);
  99. return Ember.String.pluralize(underscored);
  100. }
  101. });
  102.  
  103. // Everything below is all here to use underscores in API params.
  104. // You may or may not need this.
  105.  
  106. DS.RESTSerializer.reopen({
  107. modelTypeFromRoot: function(root) {
  108. console.log("modelTypeFromRoot " + root);
  109. var camelized = Ember.String.camelize(root);
  110. return Ember.String.singularize(camelized);
  111. }
  112. });
  113.  
  114. App.ApplicationSerializer = DS.RESTSerializer.extend({
  115. normalize: function(type,hash,property) {
  116. var normalized = {},normalizedProp;
  117.  
  118. for (var prop in hash) {
  119. if (prop.substr(-3) === '_id') {
  120. // belongsTo relationships
  121. normalizedProp = prop.slice(0,-3);
  122. } else if (prop.substr(-4) === '_ids') {
  123. // hasMany relationship
  124. normalizedProp = Ember.String.pluralize(prop.slice(0,-4));
  125. } else {
  126. // regualarAttribute
  127. normalizedProp = prop;
  128. }
  129.  
  130. normalizedProp = Ember.String.camelize(normalizedProp);
  131. normalized[normalizedProp] = hash[prop];
  132. }
  133.  
  134. return this._super(type,normalized,property);
  135. }
  136. });

猜你在找的JavaScript相关文章