2014-12-30 3 views
2

Я пытаюсь отфильтровать результат моего hasMany-Array async-get с filterBy и условие isRoot = true. Свойство isRoot - это вычисленное свойство, и кажется, что функция filterBy от ember не ждет, пока обетование решится. Вот мой код:Ember.JS - Невозможно фильтровать или фильтровать на основе вычисленных свойств

модель каталог

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; 
    }); 

Кто-то, кто знает решение для моей проблемы? Thx заранее!

UPDATE

Я сделал JSBIN с шоу моей текущей проблемы. Здесь ссылка JSBIN link to my example

+0

Не можете ли вы просто сделать 'directories.filter (function (dir) {return dir === null})' (или извлечь dir === null part out) –

+0

Если вы можете получить его на jsbin для нас играть - было бы легче разобраться в этом – Kalman

+0

Привет, Бенджамин! Каталог - это только корневой каталог, если родительский каталог (каталог отношений «в каталоге-модели»), к которому он присоединен, равен NULL. Ваш пример - хорошая идея, но чтобы получить ожидаемый результат, я должен был бы сделать что-то вроде этого: 'directories.filter (function (dir) {return dir.get ('directory'). Then (function (directory) {return directory = = null});}); 'все еще оставляет меня с обещанием – mnie

ответ

2

Я сама придумала решение. Я использую 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 предоставляет определенную функциональность, например. здесь равны?

Смежные вопросы