Ember.js EmberJs filterBy不返回结果

Ember.js EmberJs filterBy不返回结果,ember.js,Ember.js,我正在努力解决我看到的一个问题,调试很困难。请参阅下面我的代码片段 值得注意的是,这是一个稍微经过重构的版本,以使不了解我所在领域的开发人员更易于阅读 // snippet function from my controller availableChildren: Em.computed(function () { var adult = this.get('selectedAdult'); var isMale = this.get('showOnlyBoys');

我正在努力解决我看到的一个问题,调试很困难。请参阅下面我的代码片段

值得注意的是,这是一个稍微经过重构的版本,以使不了解我所在领域的开发人员更易于阅读

 // snippet function from my controller
 availableChildren: Em.computed(function () {
    var adult = this.get('selectedAdult');
    var isMale = this.get('showOnlyBoys');
    if (adult === undefined || adult === null)
        return [];

    var children = adult.get('children');
    console.log(children); // returns Class {isFullfilled: false ...}
    console.log(children.length); // returns undefined
    console.log(children.get('length')); // returns 0
    console.log(Ember.isArray(children)); // returns true
    var childArray = Ember.makeArray(children);
    console.log(childArray); // returns Class {isFullfilled: false ...}
    console.log(childArray.get('length')); // returns 0
    console.log(isMale); // returns true, half the children are male
    var boys = childArray.filterBy('isMale', isMale);
    console.log(boys); // returns [_super: function, nextObject ...]
    console.log(boys.length); // returns 0
    // when this is bound to the Ember.Select it is populated with all 
    // the children of the selected parent
    return children;
    // if I comment out the line above and return the boys then the 
    // Ember.Select is not populated with anything
    return boys;
}).property('selectedAdult', 'showOnlyBoys'),

App.Parent = DS.Model.extend({
   name: DS.attr('string'),
   isMale: DS.attr('bool'),
   children: DS.hasMany('child', { async: true })
});

App.Child = DS.Model.extend({
   name: DS.attr('string'),
   isMale: DS.attr('bool'),
   parent: DS.belongsTo('parent', { async: true })
});

// in my html
{{view Ember.Select
    content=availableChildren
    optionLabelPath="content.name"
    optionValuePath="content.id"
    selection=selectedChild
    prompt="Please Select..."
}}
如您所见,我试图根据另一个填充SelectedAdalt变量的下拉列表的结果来驱动下拉列表中的项目。如果我只是返回所选父对象的未筛选的子对象,则“依亲关系”下拉列表将按预期呈现,但是如果我尝试筛选结果,则下拉列表中不会显示任何内容

我尝试过各种方法,包括Ember.RSVP.filter,但我认为这种方法失败了,因为children变量派生自成人.get'children',它不是一个承诺,而是一个Ember.Object

我的头撞到墙上的是Ember.isArray,它返回true,但是当我为了调试目的尝试获取长度时,我总是得到零。当时的想法是,‘好吧,也许我必须将其转换为一个数组,因为它当前是一个余烬。对象’,但这也不起作用

有人吗

console.log(children); // returns Class {isFullfilled: false ...}
这意味着你的承诺还没有解决,所以没有数据。Ember数据返回一个数组,这是一个承诺,但实现了数组方法。因此,您可以将其视为普通数组,但只有在解析之后。尝试将selectedAdult.children.@每个添加到属性的依赖项中。该属性仍将在承诺解析之前进行计算,但应在承诺解析时进行最后一次计算

availableChildren: Em.computed(function () {
    var adult = this.get('selectedAdult');
    var isMale = this.get('showOnlyBoys');
    if (adult === undefined || adult === null)
        return [];

    var children = adult.get('children');
    return Ember.makeArray(children).filterBy('isMale', isMale).toArray();
}).property('selectedAdult.children.@each', 'showOnlyBoys'),

好的,get'children'返回一个承诺,老实说,这就是我所想的,这就是为什么我还尝试了Ember.RSVP.filterchildren,functionchild{return child.isMale==isMale}。但事实并非如此。我发现了这个,但我看不出我做错了什么还有一个问题,这将如何让我在返回孩子之前过滤他们?i、 e.var boys=roundArray.filterBy'isMale',isMale;我想返回过滤后的结果,我不知道如何添加SelectedAdalt.children。@每个属性都作为依赖项,因为计算属性依赖于SelectedAdalt,而SelectedAdalt是另一个成员绑定的变量。Select控件。。。这有意义吗?我从来没有使用过Em.RSVP.filter,所以我恐怕不能给出太多的建议。但添加额外的依赖项会有所帮助的原因是,它将强制属性再次更新。第一次通过时,筛选不起作用,因为PromiseArray为空。如果添加该额外属性,则在填充PromiseArray时将强制更新,从而导致筛选器按预期工作。很抱歉,这不起作用,我也尝试了selectedAdult.children,但两者都导致断言失败:每个循环所覆盖的值必须是数组。错误也许是时候尝试一下Angular了,让级联下拉菜单与一些过滤一起工作应该不会那么困难或痛苦。对不起,我不再习惯于余烬数据了。它返回一个集合而不是数组,因此必须使用return boys.toArray;相反另外,Angular确实更容易启动和运行,但不要让它看起来像是一个微不足道的问题。您希望Ember从您的服务器获取数据,并在发生更改时自动更新页面。这不是一个容易解决的问题。而采用更简单的肮脏检查方式,如角度检查,效率极低。我同意GjK的观点。承诺还没有实现。您在哪里从服务器获取模型?