2015-02-18 2 views
1

Я создаю форму, и я пытаюсь найти простой и элегантный способ обработки, чтобы увидеть, существуют ли все входы.Ember - Custom Computed Property, чтобы проверить, существуют ли все зависимые поля

Form = Ember.Object.extend({ 
    // section 1 
    name: null, 
    age: null, 
    isABoolean: null, 

    // section 2 
    job: null, 
    numberOfSiblings: null, 

    isComplete: Ember.computed.and('_isSection1Complete', '_isSection2Complete'), 

    _isSection1Complete: function() { 
    var isPresent = Ember.isPresent; 
    return isPresent(this.get('name')) && isPresent(this.get('age')) && isPresent(this.get('isABoolean')); 
    }.property('name', 'age', 'isABoolean'), 

    _isSection2Complete: function() { 
    var isPresent = Ember.isPresent; 
    return isPresent(this.get('job')) && isPresent(this.get('numberOfSiblings')); 
    }.property('job', 'numberOfSiblings') 
}); 

Однако, похоже, это не масштабируется. Мое фактическое приложение будет иметь множество разделов (более 20 разделов).

Я ищу попытку создать повторно используемое вычислимое свойство, которое соответствует моим потребностям. Возьмем, например, код, что я собираюсь для:

Form = Ember.Object.extend({ 
    // properties... 

    isComplete: Ember.computed.and('_isSection1Complete', '_isSection2Complete'), 

    _isSection1Complete: Ember.computed.allPresent('name', 'age', 'isABoolean'), 

    _isSection2Complete: Ember.computed.allPresent('job', 'numberOfSiblings') 
}); 

Я чувствую, что это обычное дело, но я не в состоянии найти правильные вычисляемые свойства о том, как выполнить это, так что я хотел бы сделай мой собственный.

Два вопроса:

  1. Где лучшее место, чтобы определить пользовательские вычислен свойства? Могу ли я просто подключить функцию к Ember.computed?
  2. Есть ли более простой способ решить эту проблему? Я чувствую, что я пропускаю что-то простое.

ответ

1

я должен был сделать небольшую корректировку к решению Эванса, но это прекрасно работает для тех, кто еще, что нужно это:

App.computed = { 
    allPresent: function() { 
    var propertyNames = Array.prototype.slice.call(arguments, 0); 
    var computedArgs = propertyNames.slice(0); // copy the array 

    computedArgs.push(function() { 
     return propertyNames.map(function (propertyName) { 
     // get the value for each property name 
     return this.get(propertyName); 
     }, this).every(Ember.isPresent); 
    }); 

    return Ember.computed.apply(Ember.computed, computedArgs); 
    } 
}; 

Это теперь может быть использован как таковой:

_isSection2Complete: App.computed.allPresent('job', 'numberOfSiblings') 
3

Что касается Вопрос # 1,

Вы можете определить пользовательские вычисленного помощник в App пространстве имен. В этом примере я создал новый вычислительный помощник под названием allPresent, который проверяет каждое переданное свойство против Ember.isPresent.

App.computed = { 
    allPresent: function (propertyNames) { 
    // copy the array 
    var computedArgs = propertyNames.slice(0); 

    computedArgs.push(function() { 
     return propertyNames.map(function (propertyName) { 
     // get the value for each property name 
     return this.get(propertyName); 
     }, this).every(Ember.isPresent); 
    }); 

    return Ember.computed.apply(Ember.computed, computedArgs); 
    } 
}; 

Он может быть использован, как это, в вашем примере кода:

_isSection2Complete: App.computed.allPresent(['job', 'numberOfSiblings']) 

Я приспособил это от подхода здесь: http://robots.thoughtbot.com/custom-ember-computed-properties

Что касается Вопрос № 2, я не могу думать более простого решения.

+0

Будет ли это работать если свойство существует, но имеет значение 'false'? –

+1

Помощник 'allPresent' использует' Ember.isPresent', и поэтому он следует той же семантике. 'Ember.isPresent (false)' возвращает 'true', поэтому он работает в этом смысле. –

+0

это именно то, что мне нужно. спасибо кучу evan! – egaba

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