小编Sar*_*rus的帖子

Ember.js和Ember数据:当父级和子级尚不存在时,如何使用hasMany关系创建记录

对于我用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)

ember.js ember-data

35
推荐指数
2
解决办法
2万
查看次数

Ember.js:如何从store.findRecord调用访问JSON API元数据

我目前正试图弄清楚如何在使用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.js ember-data json-api

6
推荐指数
1
解决办法
1829
查看次数

调用 ember 数据的 destroyRecord() 时如何从 json-api 服务器的 200 响应中访问顶级元键

我正在开发一个使用 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)

ember.js ember-data json-api

6
推荐指数
1
解决办法
887
查看次数

PEGJS:为谓词优先语法生成 AST

我又回到探索 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)

javascript grammar parsing abstract-syntax-tree pegjs

3
推荐指数
1
解决办法
919
查看次数

Ember.js:触发'Ember.computed.filter'以在控制器中更改属性时进行更新

我正在尝试使用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更新自身.

http://emberjs.jsbin.com/pitefica/1/edit

感谢您的时间和任何帮助.

ember.js

2
推荐指数
1
解决办法
4389
查看次数

Ember.js:观察器出现意外的Ember.run.debounce行为...经过反跳周期后多次触发

我在使用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毫秒后,您键入的每个字符都会触发一次反跳功能。

http://jsbin.com/gagocufofavi/1/edit?html,css,js,输出

问题:

我认为去抖动通常用于阻止函数触发,直到触发该函数的事件停止发生(在设置的时间窗口内)为止,并且应该只触发一次。

  1. 我对Debounce的理解完全消失了吗?
  2. 我的代码完全错误吗?
  3. 如何实现所需的行为?

我正在使用以下版本:

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)

谢谢!

ember.js

2
推荐指数
1
解决办法
774
查看次数