Я изучаю ember, воссоздавая TodoMVC в EmberCli. Ive воссоздал все функциональные возможности, но я столкнулся с проблемой, и я надеялся, что кто-то может пролить свет на ситуацию.Наблюдение за изменениями в ItemController в контроллере массива
Кажется, что мой Todos ArrayController будет наблюдать и запускать функции, когда свойства в моей модели меняются, но не когда меняются значения в моем объекте ObjectController.
Я переехал isEditing в Model, так что, когда я звоню editTodo
canToggle
пожаров. Но я бы предпочел сохранить это значение в моем контроллере, а не в модели.
Я установил тест с помощью propTest boolean. при нажатии кнопки я запускаю propToggle
, но todoPropToggle
не отвечает на изменение. Единственный раз, когда он когда-либо срабатывает, - это инициализация.
Любое понимание было бы очень полезно.
TODOS CONTROLLER
import Ember from 'ember';
export default Ember.ArrayController.extend({
actions: {
createTodo: function() {
var title = this.get('newTitle');
if (!title.trim()) {
return;
}
var todo = this.store.createRecord('todo', {
title: title,
isCompleted: false,
isEditing:false
});
this.set('newTitle', '');
todo.save();
}
},
canToggle: function() {
var isEditing = this.isAny('isEditing');
return this.get('length') && !isEditing;
}.property('length','@each.isEditing'),
todoPropToggle: function() {
var hasPropTest = this.isAny('propTest');
return hasPropTest;
}.property('@each.propTest')
});
TODO CONTROLLER
import Ember from 'ember';
export default Ember.ObjectController.extend({
actions: {
editTodo: function() {
var todo = this.get('model');
todo.set('isEditing', true);
},
removeTodo: function() {
var todo = this.get('model');
todo.deleteRecord();
todo.save();
},
acceptChanges: function() {
var todo = this.get('model');
todo.set('isEditing', false);
if (Ember.isEmpty(this.get('model.title'))) {
this.send('removeTodo');
}
else {
this.get('model').save();
}
},
propToggle:function(){
this.set('propTest',!this.get('propTest'));
}
},
propTest:true,
isCompleted: function(key, value) {
var model = this.get('model');
if (value === undefined) {
return model.get('isCompleted');
}
else {
model.set('isCompleted', value);
model.save();
return value;
}
}.property('model.isCompleted')
});
Это похоже на работу, но это действительно конец для того, что я хотел бы делать. Это действительно лучшая практика для такого типа функциональности? Основываясь на коде в примере TodoMVC, я ожидал более чистого пути. – Caranicas
Я думаю, что другое решение, которое может быть лучше, - это решение на основе маршрута. Таким образом, на вашем маршруте todo используйте активировать и деактивировать крючки, чтобы установить свойство canToggle в контроллере todos. –
Означает ли это, что нет никакого способа наблюдать свойство объектных контроллеров от контроллера массива? – Caranicas