Ember.JS - 无法根据计算属性进行过滤或过滤

Posted

技术标签:

【中文标题】Ember.JS - 无法根据计算属性进行过滤或过滤【英文标题】:Ember.JS - Cannot filterBy or filter based on computed properties 【发布时间】:2015-02-26 23:36:58 【问题描述】:

我正在尝试使用 filterBy 和条件“isRoot”== true 过滤我的 hasMany-Array async-get 的结果。 “isRoot”属性是一个计算属性,似乎 ember 的 filterBy 函数不会等待 promise 解决。这是我的代码:

目录模型

App.Directory = DS.Model.extend(App.ModelEventHandler, 
   name: DS.attr('string', defaultValue: ''),
   users: DS.hasMany('user', async: true),
   isRootOfShare: DS.attr('boolean', defaultValue: false),
   directories: DS.hasMany('directory', async: true, inverse: 'directory'),
   directory: DS.belongsTo('directory', async: true, inverse: 'directories'),
   shares: DS.hasMany('share', async: true),
   files: DS.hasMany('file', async: true),
   isRoot: function () 
       var directoryPromise = this.get('directory');
       return directoryPromise.then(function (directory) 
           var isRoot = directory === null;
           return isRoot;
       .bind(this));
.property('directory')

用户模型

App.User = DS.Model.extend(App.ModelEventHandler, 
   // Attributes begin
   email: DS.attr('string'),
   isCurrentUser: DS.attr('boolean', defaultValue: false),
   // Relationships
   directories: DS.hasMany('directory', async: true),
   shares: DS.hasMany('share', async: true) 

我用来过滤目录的语句:

user.get('directories').then(function (directories) 
        //TODO: Fix isRoot
        var filteredDirectories = directories.filterBy('isRoot', true);
        return filteredDirectories;
    );

这里有人知道我的问题的解决方案吗?提前谢谢!

更新

我制作了一个 JSBIN 来显示我当前的问题。这里是链接JSBIN link to my example

【问题讨论】:

你不能只做directories.filter(function(dir) return dir === null )(或提取 dir === null 部分) 如果你能把它放在 jsbin 上让我们玩 - 它会更容易弄明白 嗨本杰明!如果其附加的父目录(目录模型中的关系“目录”)为空,则目录仅是根目录。您的示例是个好主意,但要获得预期的结果,我必须这样做:directories.filter(function(dir)return dir.get('directory').then(function(directory)return directory == null);); 仍然给我留下了一个承诺 用jsbin更新了问题!提前感谢您查看它。 【参考方案1】:

我自己想出了一个解决方案。我正在使用 Ember.computed.equal 而不是计算属性。 这里是部分代码

isRoot: Ember.computed.equal('directory.content', null),

工作 jsbin 示例 http://jsbin.com/kiwujohefa/1/edit?js,output .

有人知道计算属性和 ember.computed.equal 之间的技术区别是什么吗?我认为在引擎盖下它们的工作方式相同,只是 ember.computed.equal 提供了特定的功能,例如这里相等吗?

【讨论】:

以上是关于Ember.JS - 无法根据计算属性进行过滤或过滤的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js、set() 和计算属性

Ember.js 在回调中返回计算属性

Ember.js:在服务的把手中使用计算属性

组件中的 Ember.js 计算属性 vs 观察者 vs didReceiveAttrs()

coffeescript 1.7 破坏了我的 ember.js 计算属性

使用两个输入字段创建具有计算机属性(getter 和 setter)的 Date 对象 Ember JS