Как использовать методы получения / настройки Ember для свойств с точками?

#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), это в значительной степени то, что я делаю. Спасибо за вашу помощь!