1

Discourse 的一位创始人在他的博客http://eviltrout.com/2013/02/27/adding-to-discourse-part-1.html上发布了一篇文章,解释了他如何在 Ember 中进行 ajax 查询(而不是使用 Ember 数据)。如果用户导航到一条路线,它将触发一个 found 方法

路线

   Discourse.AdminReportsRoute = Discourse.Route.extend({
     model: function(params) {
        return(Discourse.Report.find(params.type));
      },

查找方法

Discourse.Report.reopenClass({
  find: function(type) {
    var model = Discourse.Report.create();
    jQuery.ajax("/admin/reports/" + type, {
      type: 'GET',
      success: function(json) {
        model.mergeAttributes(json.report);
        model.set('loaded', true);
      },
    });
    return(model);
  }
});

我使用不同的示例使其工作,但是,在成功回调中,我收到此错误消息

Uncaught TypeError: Object [object Object] has no method 'mergeAttributes' 

因为我没有设置 Discourse,所以我创建了一个不同的域模型

App.Restaurant = Ember.Object.extend({});

App.Restaurant.reopenClass({
  find: function(type) {
    var model = App.Restaurant.create();
    jQuery.ajax("restaurants/",{
      type: 'GET',
      success: function(json) {
        console.log(json);
        model.mergeAttributes(json.restaurants);
        model.set('loaded', true);
      },
    });
    return(model);
  }
});

在成功回调中记录 json 显示了这一点

Object {restaurants: Array[28]}
restaurants: Array[28]
__proto__: Object

为什么我的模型上没有定义 mergeAttributes?

我试图删除 model.mergeAttributes 并做

 success: function(json) {    
        model.set('loaded', true);
      },

我收到这个错误

Assertion failed: The value that #each loops over must be an Array. You passed <App.Restaurant:ember322> 

所以如果我不能做mergeAttributes,有没有办法让成功回调中返回的数据成为一个数组?

{{#if loaded}}
<ul>
   {{#each item in model}}
      <li>{{item}}</li>
    {{/each}}
    </ul>

    {{else}}
  {{ loading}}
{{/if}}

--

  model: function(params) {
    return(App.Restaurant.findAll(params));

  },

  renderTemplate: function() {
    this.render('restaurants', {into: 'application'});
  }  
4

1 回答 1

2

有几个问题:

首先,mergeAttributes没有内置到 Ember 中。这是 Discourse 定义的Discourse.Model,他们使用的模型基类是哪个。定义在这里:https ://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/models/model.js#L12-L38

第二个问题是,在您的App.Restaurant.find通话中,您正在获取餐厅列表,然后创建一个模型并返回它。因此,传递给each助手的对象只是一个App.Restaurant对象而不是数组。这就是Assertion failed您粘贴的错误所指的内容。

要完成您想要的,您可能应该执行以下操作:

App.Restaurant.reopenClass({
  findAll: function() {
    jQuery.getJSON("restaurants").then(function(json) {
      return json.restaurants.map(function(attrs) {
        return App.Restaurant.create(attrs);
      });
    });
  }
});
于 2013-09-09T06:06:00.853 回答