我是Ember的新手,我正在尝试创建一个简单的应用程序,我有2个模型,山脉和山脉.范围有许多山脉,而山脉属于一个范围.我想在他们之间建立一种关系.我在网上搜索过,但我发现了不同的解释,我仍然在努力解决这个问题.
我的模特是:
mountain.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
altitude: DS.attr('number'),
range: DS.belongsTo('range', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
range.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
length: DS.attr('number'),
mountains: DS.hasMany('mountain', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
我的mirage/scenario/default.js文件看起来像这样:
export default function(server)
{
var himalaya = server.create('range', {id: 1, name:'Himalaya', length:'16598' });
var karakorum = server.create('range', {id: 2, name:'Karakorum', length:'34801' });
var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871', range_id:1 });
var K2 = server.create('mountain', {id:2, name: 'K2', altitude: …Run Code Online (Sandbox Code Playgroud) 我正试图在Ember-Cli-Mirage中建立关系.这可能是一种简单的方式,还是我必须使用固定装置而不是工厂?
这些将是我的模型:
任务:
export default DS.Model.extend({
taskName: DS.attr('string'),
team: DS.hasMany('team', {async: true}),
taskScore: DS.hasMany('taskScore', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
球队:
import DS from 'ember-data';
export default DS.Model.extend({
teamName: DS.attr('string'),
task: DS.hasMany('task'),
taskScore: DS.hasMany('taskScore', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
TASKSCORE:
import DS from 'ember-data';
export default DS.Model.extend({
score: DS.attr('number'),
team: DS.belongsTo('team'),
task: DS.belongsTo('task'),
});
Run Code Online (Sandbox Code Playgroud) 我正在使用ember-cli-mirage来满足请求.因为我有我的rails api来满足这些要求,我如何从我的余烬中删除或卸载ember-cli-mirage?
如果要删除mirage文件夹,我会收到构建错误!
使用Mirage我需要模拟我的GET请求,该请求以二进制字符串的形式返回数据(格式为gzip).这是我第一次使用海市蜃楼,我不知道我是否在嘲笑二元响应,我应该返回一个有效值吗?这是我现在如何嘲笑它.
this.get('/myproxy/api/v1/network/download', function (db, request) {
let responseBlob = new window.Blob(['To be replaced with my actual binary data'], {type: 'application/octet-stream'})
return new Response(
200,
{'content-disposition': "attachment; filename=network.myextension; filename*=UTF-8''network.myextension"},
responseBlob
)
})Run Code Online (Sandbox Code Playgroud)
这是我的场景:在收到来自后端的响应后,我只是将repose转换为blob并将其下载为文件.如果我在模拟数据时应该创建有效的二进制数据,我该如何使用海市蜃楼?我应该将它作为文件存储在某处并将其用作模拟响应吗?如果有人可以帮助我,我感激不尽.
我正在开发我的第一个Ember应用程序并让它以路径返回静态JSON对象来显示我想要的方式model():
element: {
name: "First Element",
divisions: [{
name: "First Division",
sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
}, {
name: "Second Division",
sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
}]
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试重构使用Ember Data + Mirage并且度过了一段糟糕的时光.
这是我的index.js路线
export default Ember.Route.extend({
model() {
return this.store.find('element', 1);
},
Run Code Online (Sandbox Code Playgroud)
如果我config.js像这样设置我的幻影:
this.get('/elements', function() {
return {
elements: [
{
id: 1,
name: 'First Element',
divisions: [1, 2]
}
]
}
});
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
Your Ember app tried …Run Code Online (Sandbox Code Playgroud) --使用 Ember 数据 2.7.1--
我试图颠倒记录集合的顺序,而无需先使用 toArray() 将它们转换为数组。这个对象集合来自 this.store.findAll('history-item') 返回的 promise。
我想以 ember 的方式做到这一点,而不是让它们成为普通的 javascript。我收到来自 record-array.js 的 TypeError: internalModel.getRecord。出于某种原因,当它尝试执行 objectAtContent() 时,它正在查看的内容似乎没有类型。通过堆栈跟踪,我可以看到我正在处理的对象是 [Class],类是历史项目模型。在 objectAtContent() 之前的一些堆栈调用,正在处理的对象从那个历史项目模型切换到其他没有类型属性的 Class 对象。
我能够使用 Ember Inspector 正确查看我的数据,如果我只是在我的模板上显示原始记录集合,它会正确显示。
有没有人遇到过这个?
一些想法和考虑:
- findAll() 如何使用它的承诺,因为它在后台重新加载而不允许逆转,这有什么特别之处吗?我确实希望它继续重新加载实时数据。
-我正在使用 ember-cli-mirage 来模拟我的数据库和端点,并且我已经按照我认为的信件中的说明进行操作。我将未配置的 JSONAPISerializer 用于海市蜃楼,并使用未配置的 JSONAPIAdapter 用于 ember。它与从后面发送的元数据有什么关系吗?它可能与未设置的模型或记录有关吗?我有什么特别的事情要做吗?
定义模型并尝试反转它的路由段:[注意:我知道在路由中准备数据(排序)可能不是惯例,但为了便于描述,我只是把它放在这里。我通常在控制器或组件的外部进行]
model(){
return this.get('store').findAll('history-item').then(function(items){
return items.reverseObjects();
}).catch(failure);
Run Code Online (Sandbox Code Playgroud)
历史列表模型声明:
export default DS.Model.extend({
question: DS.attr('string'),
answer: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
Ember-Cli-Mirage config.js 端点:
this.get('/history-items', (schema) => {
return schema.historyItems.all();
});
Run Code Online (Sandbox Code Playgroud)
历史项目的 Ember-Cli-Mirage 固定装置:
export default [
{id: 1, question: "1is this working?", …Run Code Online (Sandbox Code Playgroud) 我正在尝试在此 Ember项目中对 POST 请求使用直通
this.passthrough('/thirdeye/entity?entityType=ANOMALY_FUNCTION');
Run Code Online (Sandbox Code Playgroud)
这就是调用的样子app/mirage/config.js。我收到以下错误:
Mirage: Your Ember app tried to POST '/thirdeye/entity?entityType=ANOMALY_FUNCTION',
but there was no route defined to handle this request.
Define a route that matches this path in your
mirage/config.js file. Did you forget to add your namespace?
Run Code Online (Sandbox Code Playgroud)
显然,我已将该调用添加到配置文件中,但它没有被拾取。我读到这只passthrough适用于>= jquery 2.x我的项目。
有谁知道还有什么可能导致这种情况?
使用最新的Ember(3.2),ember-cli-mirage 0.4.7,ember-cli-qunit 4.3.2,ember-qunit 3.4.1
我正在使用ember-cli-mirage来尝试前端测试,我无法解决这个错误:
Uncaught TypeError: template.getProperties is not a function
Run Code Online (Sandbox Code Playgroud)
我在组件测试中运行它:
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Integration | Component | template-editor', function(hooks) {
setupRenderingTest(hooks);
setupMirage(hooks);
test('it renders', async function(assert) {
const mockTemplate = server.create('template');
this.set('mockTemplate', mockTemplate);
await render(hbs`{{template-editor template=mockTemplate}}`);
assert.equal(this.get('template.name'), 1);
});
});
Run Code Online (Sandbox Code Playgroud)
我的组件JS文件的相关部分是这样的:
export default Component.extend({
init () {
this._super(...arguments);
let template = this.get('template');
if …Run Code Online (Sandbox Code Playgroud) 嘿,我需要修改一些从DataStore获取的记录.如果我在路由器中添加以下代码,我可以看到请求传递给我的模板,但我无法修改集合的每个请求,因为集合是空的.
model() {
return this.store.findAll('user').then(function(users) {
console.log(users.get('length')); // 0
return users;
});
}
Run Code Online (Sandbox Code Playgroud)
我认为当从服务器获取所有记录时,promise会得到解决,但事实并非如此.或者我完全错过了什么.
我还尝试使用相同的结果修改afterModel回调中的模型.
我正在使用Ember 1.13.0(使用Ember-CLI),Ember-Data 1.13.4和ember-cli-mirage来模拟我的HTTP请求.
更新: 我设法为此问题创建了一个解决方法.在我的控制器中,我创建了一个新属性,它监听模型.@ each然后我能够修改模型并将其传递给视图.
export default Ember.Controller.extend({
users: function() {
return this.get('model.users').filter(function(user) {
// The Promise is resolved twice
// The first time with an empty model and the second time with
// the actual data. So I filter the empty model.
return user.get('id');
}).map(function(user) {
// do fancy stuff with our user
return user
});
}.property('model.@each')
});
Run Code Online (Sandbox Code Playgroud) 我试图在我的测试中使用ember-cli-mirage但遇到问题.我正在使用ember和ember-data 2.1.0,因此可能与此有关.
我可以在开发中使用海市蜃楼.我已经定义了工厂,路线,方案等没有问题.
问题是当我尝试在测试中创建模型时.以下测试错误:
import Ember from 'ember';
import { module, test } from 'qunit';
import startApp from 'frontend/tests/helpers/start-app';
let application;
module('Acceptance | Customer', {
beforeEach() {
application = startApp();
},
afterEach() {
Ember.run(application, 'destroy');
}
});
test('viewing customers', function(assert) {
server.createList('customer', 2);
visit('/admin/customers');
andThen(() => assert.equal(find('#customers-table tbody tr').length, 2));
});
Run Code Online (Sandbox Code Playgroud)
这导致:
not ok 1 PhantomJS 1.9 - Acceptance | Customer: viewing customers
---
actual: >
null
message: >
Died on test #1 at http://localhost:7357/assets/test-support.js:3124
at http://localhost:7357/assets/frontend.js:2434
at http://localhost:7357/assets/vendor.js:150
at …Run Code Online (Sandbox Code Playgroud)