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 计算属性 vs 观察者 vs didReceiveAttrs()