对于我用ember-data做的大多数事情似乎就是这种情况,简单的测试用例非常简单,但由于我缺乏理解(我认为文档),任何"真实"都会迅速崩溃.在最简单的情况下,我可以创建新记录并将其保存到我的REST API.我将使用普遍的水果篮示例,然后开始只保存一个新的fruit.
// Here is our fruit model
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
});
// This is easy to create and save
var fruit = this.store.createRecord('fruit', {
name: 'apple',
color: 'red'
});
fruit.save().then(successCallback, errorCallback);
Run Code Online (Sandbox Code Playgroud)
好的,我在这里没问题.在概念上有意义,代码很干净,而且看起来很好看!现在假设我们有一个basket模型,该basket模型可以容纳很多fruit.此外,用户可以创建新的fruit并将其添加到basket尚未在UI的一步中创建的新的.
所以这里有新车型:
module.exports = App.Fruit= DS.Model.extend({
name: attr('string'),
color: attr('string')
basket: DS.belongsTo('basket')
});
module.exports = App.Basket = DS.Model.extend({
fruits: DS.hasMany('fruit', {async:true})
});
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,假设用户输入了两个当前不存在于商店或后端REST API中的新结果,将它们添加到他的新购物篮(现在还不存在)中,然后点击"保存" .
如何使用Ember Data创建此记录?我希望你能做到这样的事情:
var newFruits = Ember.A(); …Run Code Online (Sandbox Code Playgroud) 我目前正试图弄清楚如何在使用store.findRecord()呼叫时访问元数据.
在指南(http://guides.emberjs.com/v2.1.0/models/handling-metadata/)中,它表示可以通过执行以下操作来访问元数据:
store.query('post').then((result) => {
let meta = result.get('meta');
})
Run Code Online (Sandbox Code Playgroud)
我希望这会利用工作时findRecord也
store.findRecord('book', params.id, {adapterOptions: {query: params}}).then((result) => {
let meta = result.get('meta');
})
Run Code Online (Sandbox Code Playgroud)
但是,这始终为meta属性返回undefined .我假设在使用时没有设置元数据findRecord.我返回有效的JSON-API meta,其顶级属性如下:
{
"meta": {
"page": {
"number": 1,
"size": 100,
"total": 20
},
"data":[
// data here
]
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在使用findRecord()和JSONAPISerializer和JSONAPIAdapters时访问服务器返回的元数据?
谢谢!
我使用以下版本:
Ember : 2.1.0
Ember Data : 2.1.0
jQuery : 1.11.3
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 Ember Data 和现在默认的 json-api 适配器的 Ember 应用程序。
根据 json-api 规范 ( http://jsonapi.org/format/#crud-deleting ),删除记录时,200如果删除成功,服务器应返回响应,并且服务器仅使用顶级meta密钥进行响应。
我当前的服务器就是这样做的,我试图弄清楚在使用 Ember Data 的model.destroyRecord()方法时如何访问顶级元对象中的数据。
myModel.destroyRecord().then(function(model){
// the returned value is the model. How can I get the actual metadata
// returned by the server?
});
Run Code Online (Sandbox Code Playgroud)
服务器响应包含有关确切删除内容的信息,如下所示:
{
"meta": {
num-deleted-a: 10,
num-deleted-b: 100,
num-deleted-c: 200
}
}
Run Code Online (Sandbox Code Playgroud)
我想获取此信息,以便将其显示给用户。
谢谢!
我正在使用以下版本:
Ember : 2.2.0
Ember Data : 2.3.3
jQuery : 1.11.3
Run Code Online (Sandbox Code Playgroud) 我又回到探索 pegjs 了,显然还没有掌握核心概念。我正在尝试解析以谓词开头的“查询语言”,然后是操作数列表(其中可能包含另一个谓词)。所以一个简单的例子是:
OR(
"string1"
"string2"
)
Run Code Online (Sandbox Code Playgroud)
我希望将上述内容转换为:
{
predicate: "OR",
operands: [
{
type: "STRING",
value: "string1"
},
{
type: "STRING",
value: "string2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这个查询:
OR(
"string1"
"string2"
AND (
"string4"
"string5"
)
"string3"
)
Run Code Online (Sandbox Code Playgroud)
将成为这个 AST:
{
predicate: "OR",
operands: [
{
type: "STRING",
value: "string1"
},
{
type: "STRING",
value: "string2"
},
{
predicate: "AND"
operands: [
{
type: "STRING",
value: "string4"
},
{
type: "STRING",
value: "string5"
}
]
},
{
type: "STRING",
value: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Ember.computed.filter基于文本输入的输入来过滤ArrayController的内容.
App.IndexController = Ember.ArrayController.extend({
filteredPeople: Ember.computed.filter('model', function(person){
var searchFilter = this.get('searchFilter');
var regex = new RegExp(searchFilter, 'i');
return person.firstName.match(regex);
}),
// this is bound to the value of a text input helper
// I'm just pre-filling the value to show that the filtering does work
searchFilter: 'kris'
});
Run Code Online (Sandbox Code Playgroud)
这很好用,并按预期过滤.但是,我希望它随时更新值的更新searchFilter(即任何时候有人输入文本输入).现在的问题是,只有在对模型本身进行更改或控制器首次加载时才会更新.
无论如何都会在Ember.computed.filter更新时触发searchFilter更新?我正在使用,Ember.computed.filter因为它看起来比普通的计算属性更有效,我相信每次都会重新创建整个数组(如果我错了,请告诉我).另外,Ember.compute.filter简单易用,非常干净!
我用上面的设置创建了一个JSBin.当用户键入文本框时,我想以某种方式触发Ember.computed.filter更新自身.
感谢您的时间和任何帮助.
我在使用Ember.run.debounce时遇到了一些困难。我将第一个承认我可能误会了应该如何使用反跳。
我的问题:
我有一个输入文本框,我想基于输入框中的文本构造一个正则表达式。我在输入助手值字段上设置了一个观察器,但是该观察器在每次输入更改时都会触发。我真正想要的是仅在用户停止输入X时间后才构建正则表达式。
所以这是观察者的样子:
inputTextObservor: function(){
//Build Regular Expression and do other logic
}.observes('inputText')
Run Code Online (Sandbox Code Playgroud)
我认为可行:
我以为我可以使用Ember.run.debounce将正则表达式创建逻辑包装在观察器中,这样可以防止在用户键入内容时创建正则表达式。
inputTextObservor: function(){
Ember.run.debounce(this, function(){
// Build Regular Expression and do other logic
// should only be called if the user stops typing
// for 2000 milliseconds
}, 2000)
}.observes('inputText')
Run Code Online (Sandbox Code Playgroud)
实际发生的情况:
使用上面的设置,debounce中的regexp创建逻辑不会执行2000毫秒(如在debounce调用中设置的),但是每次触发观察者时都会执行一次。因此,例如,如果反跳时间为2000毫秒,并且用户键入“ HelloWorldOfEmber”,但他们每1000毫秒(即,非常慢)键入1个字符,则我希望在反跳后2000毫秒调用一次反跳方法。用户完成键入“ HelloWorldOfEmber”。
实际发生的情况是,在2000毫秒后,将执行debounce调用,并从此开始,每次用户键入字符时都执行。
我用一个非常简单的jsbin重新创建了我的设置。jsbin中的反跳时间设置为2000毫秒。如果您在输入字段中键入内容,您会注意到,在2000毫秒后,您键入的每个字符都会触发一次反跳功能。
问题:
我认为去抖动通常用于阻止函数触发,直到触发该函数的事件停止发生(在设置的时间窗口内)为止,并且应该只触发一次。
我正在使用以下版本:
DEBUG: ------------------------------- ember.js:3911
DEBUG: Ember : 1.6.1 ember.js:3911
DEBUG: Handlebars : 1.3.0 ember.js:3911
DEBUG: jQuery : 1.10.2 ember.js:3911
DEBUG: -------------------------------
Run Code Online (Sandbox Code Playgroud)
谢谢!