需要帮助Ember-Data与Zend Rest合作.
起初,我熟悉Zend Framework,因此Rest Adapter很容易设置.telnet的请求显示它有效,响应也有格式良好的HTTP代码.
使用Ember Data的设置稍微复杂一些.我安装了一个带Ubuntu的虚拟机,安装了Ruby 1.9.3,git clone编写了ember-data存储库并用rake生成了JS文件.我还安装了bundler来解决所有依赖项.似乎工作没有错误.这对我来说是第一次.我不熟悉红宝石.
不幸的是,它似乎没有起作用.在我的测试应用程序上,我看到了firebug的其余请求.回应看起来也不错.但对象仍然是空的.
响应:
[{"id":"1","user":"testuser","password":"123","mail":"my@me.com","role":"GUEST","active":"1","hash":null,"last_login":null}]
Run Code Online (Sandbox Code Playgroud)
响应标头:
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Encoding gzip
Content-Length 121
Content-Type application/json; charset=utf-8
Date Wed, 20 Jun 2012 10:49:38 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=15, max=99
Pragma no-cache
Server Apache
Vary Accept-Encoding
X-Powered-By PHP/5.3.13
X-UA-Compatible IE=Edge,chrome=1
Run Code Online (Sandbox Code Playgroud)
我的应用:
// my script
App = Em.Application.create();
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({ bulkCommit: false, namespace: 'rest' })
});
App.User = DS.Model.extend({ …Run Code Online (Sandbox Code Playgroud) 我正在使用Ember和Ember-Data的最新代码.我有导轨作为我的后端提供JSON,这是正常的.我希望能够使用我视图中的复选框过滤Ember模型的"active"属性.我希望复选框只显示active = true的数据,如果我勾选复选框.我不想删除数组中的数据,只是隐藏数据.这就是我目前所拥有的,但它不起作用.
模型:
App.Org = DS.Model.extend({
code: DS.attr('string', { defaultValue: 'N/A' }),
name: DS.attr('string', { defaultValue: 'N/A' }),
source: DS.attr('string', { defaultValue: 'N/A' }),
status: DS.attr('string', { defaultValue: 'N/A' }),
type: DS.attr('string', { defaultValue: 'N/A' }),
note: DS.attr('string', { defaultValue: 'N/A' }),
financial_Flag: DS.attr('string', { defaultValue: 'N/A' }),
expense_Flag: DS.attr('string', { defaultValue: 'N/A' }),
revenue_Flag: DS.attr('string', { defaultValue: 'N/A' }),
created_At: DS.attr('string', { defaultValue: 'N/A' }),
updated_At: DS.attr('string', { defaultValue: 'N/A' }),
active: function() {
var status = this.get('status'); …Run Code Online (Sandbox Code Playgroud) 我尝试使用ember-data的"每种类型的适配器"功能.不确定我做错了什么,或者它是否是ember-data中的错误.基本上我认为它会像这样工作:
Person = DS.Model.extend({
name: DS.attr('string')
});
var personAdapter = DS.Adapter.create();
DS.Store.registerAdapter(Person, personAdapter );
Run Code Online (Sandbox Code Playgroud)
商店总是使用默认适配器而不是注册的'每类型适配器'我写了一个测试用例来表明我的意思:
var get = Ember.get, set = Ember.set;
var Person, store, adapter, personAdapter;
module("DS.Store and DS.Adapter 'adapter per type' integration test", {
setup: function() {
Person = DS.Model.extend({
name: DS.attr('string')
});
adapter = DS.Adapter.create();
personAdapter = DS.Adapter.create();
DS.Store.registerAdapter(Person, personAdapter);
store = DS.Store.create({ adapter: adapter });
},
teardown: function() {
adapter.destroy();
store.destroy();
}
});
test("test function on the per type adapter", function() {
adapter.find = function(store, type, …Run Code Online (Sandbox Code Playgroud) 在这个jsfiddle中,我有EmBlog.PostsNewRoute 和EmBlog.PostsEditRoute.路由包含"保存,取消和销毁"的事件.
当我创建一个新记录时,它只在内存中创建并且从不调用store.commit(),并且在控制台中,它会抛出错误:
未捕获的TypeError:无法调用未定义的方法'commit'
当我尝试编辑时,它会抛出相同的错误,但编辑仍然只在内存中发生.
销毁行动也失败了.
当我打电话取消时,我得到:
无法读取undefined的属性'defaultTransaction'
大多数代码都在jsfiddle中.保存和取消事件遵循耶胡达描述的模式:
App.NewUserRoute = Ember.Route.extend({
model: function() {
return App.User.createRecord();
},
events: {
save: function(user) {
this.get('store').commit();
}
}
});
Run Code Online (Sandbox Code Playgroud)
谢谢
我有以下问题.
在我的应用程序中,我有一个新的屏幕Site.但是当我通过action控制器保存新站点时,languages-property不会随POST-request一起发送到服务器.
添加新站点的模板是这样的:
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
{{view Ember.TextField valueBinding="name"}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="languages">Languages</label>
<div class="controls">
{{view Ember.Select contentBinding="controllers.languages" selectionBinding="languages" optionValuePath="content.id" optionLabelPath="content.description" multiple="true"}}
</div>
</div>
<div class="form-actions">
<button {{ action "createSite" }} class="btn btn-primary">Save</button>
</div>
Run Code Online (Sandbox Code Playgroud)
我把Store这个定义为:
App.Store = DS.Store.extend({
revision : 12,
adapter : DS.RESTAdapter.extend({
namespace : 'rest'
})
});
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
App.SitesNewController = Em.ObjectController.extend({
needs: ['languages'],
name: null,
languages: null,
createSite : …Run Code Online (Sandbox Code Playgroud) 我在Ember中定义了三个模型,并且根据请求返回所有json:
App.Comment = DS.Model.extend({
discussion: DS.belongsTo('App.Discussion')
});
App.Discussion = DS.Model.extend({
meeting: DS.belongsTo('App.Meeting'),
comments: DS.hasMany('App.Comment')
});
App.Meeting = DS.Model.extend({
discussions: DS.hasMany('App.Discussion')
});
Run Code Online (Sandbox Code Playgroud)
从会议控制器中的路由会议/:id,我希望能够遍历讨论集合,为每个实例设置新的讨论控制器.然后我需要能够遍历每个讨论评论,再次做同样的事情.目前我似乎能够访问关联中定义的属性,但是如果我调用计算属性,则会返回不正确的结果(例如,当它应为5时,计数为0).我认为这个问题与控制器的上下文有关,因为我似乎无法在控制器中返回该对象的值.它可能非常简单,但我看不到它.我究竟做错了什么?
这是控制器:
App.MeetingController = Ember.ObjectController.extend({
needs: ['discussion']
});
App.DiscussionController = Ember.ObjectController.extend({
commentCount: function(){
return this.get('comments.length');
}.property('comments')
});
Run Code Online (Sandbox Code Playgroud)
然后在meeting.hbs模板中:
{{#each discussion in discussions}}
{{ render 'discussion' discussion }}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
和discussion.hbs模板一样,这个工作原理:
<div>
{{ comments.length }}
</div>
Run Code Online (Sandbox Code Playgroud)
但这不是:
<div>
{{ commentCount }}
</div>
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
我正在使用带有ember-data 2.0的Ember 2.0.
在Rails中,使用真实的模型实例来模拟表单和组件是很常见的.对于posts/new表单,您将传入a Post.new并在form.html.erb模板中使用它.
在Ember中,因为召唤new Post造成了破碎的模型而变得困难.相反,我们鼓励你使用商店,并使用它this.store.createRecord('post');.
这很好,但在构建隔离组件时却没有.例如,用户可以添加多个模型的表单,例如类别创建者.在我的脑海中,结构将如下所示:
category-form/template.hbs
<button {{action 'addCategory'}}>Add category</button>
{{#each categories as |category|}}
{{input value=category.name}}
{{/each}}
<button {{action 'save'}}>Save</button>
Run Code Online (Sandbox Code Playgroud)
然后component.js将是这样的:
category-form/component.js
import Ember from 'ember';
import Category from 'app/category/model';
export default Ember.Component.extend({
categories: [],
actions: {
addCategory() {
// THIS DOES NOT WORK
this.get("categories").pushObject(new Category);
},
save() {
this.sendAction("saveCategories", this.get("categories"));
}
}
});
Run Code Online (Sandbox Code Playgroud)
上面的示例确实有效,但需要this.store.createRecord.但据我所知,该组件无法访问该商店.这是理智的,因为那将是一个混乱全球国家的组成部分.此外,createRecord如果用户导航离开而不保存模型,则在使用时最终会在商店中存在大量残留模型.
我希望category-form此示例中的组件与全局状态的其余部分完全隔离.
我的问题是,如何使用ember逻辑正确处理?
我正在使用ember 2.3.当我尝试访问组件内的存储时,我在控制台中收到以下错误.
这是我在component.js中尝试过的
export default Ember.Component.extend({
actions: {
saveEmployee : function() {
var store = this.store;
var newEmployee = store.createRecord("employee", {
fname: "Manu",
lname: "Benjamin",
email: "manu.benjamin@gmail.com",
department: "IT Services"
});
newEmployee.save().then(()=> {
console.log("Record successfully saved!!!!");
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
我是否需要在组件中包含任何使用商店的内容?
我使用的灰烬2.5.0,我有两个型号service和availability它看起来像:
// availability
import DS from 'ember-data';
export default DS.Model.extend({
day: DS.attr('string'),
enabled: DS.attr('boolean'),
startAt: DS.attr('string'),
endAt: DS.attr('string'),
service: DS.belongsTo('service')
});
Run Code Online (Sandbox Code Playgroud)
和service它看起来像:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
description: DS.attr('string'),
availabilities: DS.hasMany('availability',
{
defaultValue:
[
{
day: 'saturday',
enabled: false,
startAt: '',
endAt: ''
},
{
day: 'sunday',
enabled: false,
startAt: '',
endAt: ''
}
]
}
)
});
Run Code Online (Sandbox Code Playgroud)
你可以看到我试图使用defaultValue但没有运气.对于新路线,如果我们要创建新service记录,我想设置默认值.
任何帮助表示赞赏.
我在索引路径中将记录加载到我的商店:
model: function(){
return Ember.RSVP.hash({
cars: this.store.query('car',{}).then(function(data){
})
});
}
Run Code Online (Sandbox Code Playgroud)
然后我去我的汽车路线peekAll(没有网络请求)并获得所有的汽车记录:
model: function() {
return Ember.RSVP.hash({
cars: this.store.peekAll('car').sortBy('name')
});
}
Run Code Online (Sandbox Code Playgroud)
您会注意到我可以使用'sortBy'根据本地存储数据库中的字段对记录进行排序.
我不明白的是如何从商店过滤或查找记录?例如,如果我想执行以下操作该怎么办: