#javascript #ember.js
#javascript #ember.js
Вопрос:
В моем веб-приложении у меня есть модель со свойствами, имена которых динамически генерируются на основе данных с сервера. Например, я бы обычно ссылался на это, делая что-то подобное с моего контроллера:
var str1 = 'property.name.with.dots'; // String from server
this.get('model.someProperty')[str1].integer = 2;
this.get('model.someProperty')[str1].integer = 1;
Но Ember это не нравится — он говорит, что я должен использовать set
get
функцию or . Что имеет смысл. Итак, я хочу сделать что-то подобное вместо последней строки выше:
this.get('model.someProperty.' str1).incrementProperty('integer');
Это отлично работало бы из коробки, если str1
бы не было точек. Тем не менее, это так, так что я могу сделать, чтобы заставить геттеры Ember работать? Я пытался
this.get('model.someProperty')[str1].incrementProperty('integer');
но это не работает — подобъекты не получают методы Ember по умолчанию.
Комментарии:
1. Я бы посоветовал не использовать имена свойств с точками; вы просто создадите себе головную боль. Если вам нужно индексировать с помощью произвольных строк, используйте карту .
2. Я раньше не слышал о Map, я изучу это — спасибо!
Ответ №1:
Определенно
Массируйте данные, прежде чем передавать их Ember, наличие точек в вашем имени просто вызовет множество проблем с цепочкой.
Очистите данные, я выбрал _ (это не глубокая очистка, упражнение для вашего удовольствия)
App.cleanData = function(result){
var response = {},
re = new RegExp('\.', 'g'),
newKey;
for(var key in result){
newKey = key.replace(re, '_');
response[newKey] = result[key];
}
return response;
};
Используйте очищенные данные вместо данных сервера
App.FooRoute = Em.Route.extend({
model: function(){
return $.getJSON('/foo').then(function(result){
return App.cleanData(result);
}
}
});
Комментарии:
1. Хотя ваш метод не будет работать точно (данные поступают от Faye, а не от ajax), это в значительной степени то, что я делаю. Спасибо за вашу помощь!