【问题标题】:Ember: The response from a findQuery must be an Array, not undefinedEmber:来自 findQuery 的响应必须是一个数组,而不是未定义的
【发布时间】:2015-04-22 01:23:56
【问题描述】:

我正在尝试通过调用 API /search?q=test 来实现搜索功能。 API 返回以下对象:

{
    "categories" : 
    [
        {
            "id" : 77,
            "name" : "Animals",
            "output" : {}
        }, 
        {
            "id" : 167,
            "name" : "Fish",
            "output" : {
                "image" : {
                    "mimeType" : "image/png",
                    "path" : "/images/fish.png"
                }
            }
        }
    ],
    "designs" : []
    // more arrays here
}

这是我的 Ember search 模型:

export default DS.Model.extend({
  categories: DS.hasMany('category'),
  designs: DS.hasMany('design')
  // more hasMany relationships here
});

search 控制器中:

model: function (params) {
  return this.store.find('search', { q: params.q });
}

收到此错误“断言失败:来自 findQuery 的响应必须是一个数组,而不是未定义的”。

我是 Ember 的新手,但我觉得我还需要添加一个 search 序列化程序,但不确定在其中写什么。或者,也许还有其他原因导致了这种情况。在我看来,它应该可以正常工作,但事实并非如此。有什么建议吗?

【问题讨论】:

    标签: ember.js ember-data ember-cli


    【解决方案1】:

    使用给出的代码,您尝试查找一些(读取:数组)搜索。回复中缺少此内容,因此出现错误。

    你真正想要的是

    model: function (params) {
      return this.store.find('category', { q: params.q });
    }
    

    但这会导致向/categories?q=test 发出请求。如果服务器代码和接口完全由您自己控制,请更改服务器。如果没有,您可以使用自定义 RESTAdapter(在 ember-cli 中:ember g adapter category)和自定义 pathForType 方法。

    【讨论】:

    • 在 5 分钟内等待 8 小时 2 个答案:P
    • 哦,看来 albertjan 确实在基本相同的时间给出了基本相同的答案。阅读这些答案,相互补充......
    • 对不起,我应该更清楚搜索对象中的内容。搜索模型中实际上还有一些其他数组,但为简单起见,我只在其中留下了一个...查看我的更新问题
    【解决方案2】:
    model: function (params) {
      return this.store.find('search', { q: params.q });
    }
    

    这告诉ember-data 你想找到search 对象。所以它期望数组中的那些而不是categories

    您可以使用适配器上的pathForType 函数指定类型的路径:

    App.ApplicationAdapter = DS.RESTAdapter.extend({
      pathForType: function(type) {
        if (type == 'category') {
          return 'search';
        }
        var decamelized = Ember.String.decamelize(type);
        return Ember.String.pluralize(decamelized);
      }
    });
    

    这意味着当您请求执行此操作时:this.store.find('category', { q: params: q });

    它会向/search?q=param发出请求

    这一切都是根据文档

    未来可能会改变

    赞成这个 rfc:https://github.com/emberjs/rfcs/pull/4,这将使您能够更改特定操作的 url。

    【讨论】:

    • 对不起,我应该更清楚搜索对象中的内容。搜索模型中实际上还有一些其他数组,但为简单起见,我只在其中留下了一个...查看我的更新问题
    • 好吧,我很困惑。我不明白为什么搜索应该是一个模型。那个人的ID是什么?我很确定你在这里误用了模型。为什么不能单独搜索每种类型并进行查找?
    • 我是 Ember 的新手,我想当你像 this.store.find('search', { q: params.q }) 这样向 API 发出请求时,你需要一个模型,不是吗?我基本上有一个 API /search?q=param,它返回多个列表/数组,这些列表/数组已经在我的 Ember 应用程序中有模型。有没有更好的方法在 Ember 中调用这个 API 端点并将其推送到 Search 路由中的模型对象?
    【解决方案3】:

    对于那些感兴趣的人,我最终使用了ajax 调用,而不必依赖 Ember 数据和模型。这是我想出的解决方案:

    model: function (params) {
      var route = this;
      return Ember.$.ajax({
        url: ENV.apiHost + '/search?q=' + params.q,
        type: 'GET'
      }).then (function(result) {
        var searchObject = Ember.Object.create({
          categories: Ember.ArrayProxy.create({ content: Ember.A(result.categories) }),
          designs: Ember.ArrayProxy.create({ content: Ember.A(result.designs) }),
          // more arrays here
        });
    
        return {
          model: searchObject
        };
      });
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      相关资源
      最近更新 更多