如何在Ember CLI中从路由访问Ember模型

8

对于我来说,也许在一个包含所有代码的app.js文件中处理普通的Ember应用程序会更容易。但是由于我正在使用Ember CLI,我很难在我的路由中访问模型。我仍在努力学习如何使用Ember CLI,请帮帮我。

因为我只想发出AJAX调用并获取数据以呈现在我的用户界面上,所以我下载并将Ember Model库添加到了我的项目中。我不认为需要使用Ember Data。这是我参考的Ember Model文档:https://github.com/ebryn/ember-model#example-usage。话虽如此,以下是Ember CLI建议的目录结构:

|-app    
  |-controllers
  | |-customers.js
  |-models    
  | |-customers.js
  |-routes    
  | |-customers.js
  |-templates    
  | |-customers.hbs
  |-app.js
  |-index.html
  |-main.js
  |-router.js

这是一个简化版的项目结构,我只是为了集中精力解决问题。根据Ember Model文档的建议,我将以下代码添加到我的客户模型(model\customers.js)中:

export default Ember.Model.extend({
    nameid: attr(),
    firstname: attr(),
    middlename: attr(),
    lastname: attr(),        
    prefixname: attr(),
    suffixname: attr()
});

this.url = "http://restapi/api/customers";
this.adapter = Ember.RESTAdapter.create();

注意,我必须执行"export default"而不是"App.Customers = Ember.Model.extend..."。这是Ember CLI的惯例。因此,当我尝试访问我在Customers Route中创建的模型时,会出现错误"Error while loading route: ReferenceError: App is not defined"。
客户路由代码:
export default Ember.Route.extend({
    model: function () {
        App.Customers.find();
    },

    actions: {
        addnew: function(){
            //logic of saving edited customer
            alert('customer created!');
        }
    }
});

我尝试了 this.model() - 返回一个 supperWrapper 类型的对象,以及 this.modelFor() - 返回 null。
请建议如何在路由中获取我的模型句柄,以便我可以执行 Ember Model 提供的开箱即用的 CRUD 操作。
谢谢!
1个回答

16

我建议你将模型的文件名改为单数形式,例如customer.js

如果你想在路由文件中访问模型类,则需要导入该模型。由于Ember CLI使用ES6模块语法,你不能/不应直接访问App对象上的任何内容。这应该通过导入语句或Ember内部解析器来完成。

import Customer from "../models/customer";

现在你可以在模型钩子中使用它。你的示例代码中还有另一个错误,你必须返回从 find 调用返回的 Promise。

model: function () {
  return Customer.find();
},

我很好奇你为什么选择Ember Model而不是Ember Data,因为对于这个例子来说,使用Ember Data需要的代码更少,并且更符合我所知道的Ember方式。


谢谢您的快速回复!问题已经解决了!我正在逐步学习如何使用Ember CLI。我选择Ember Model而不是Ember Data的原因是因为我需要一个轻量级的层(数据访问层),没有持久性。说实话,这也部分是因为Ember Data被指称存在不稳定性。 - Vinay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接