2014-01-29 11 views
0

Я создаю административный компонент, который строит небольшую форму для редактирования свойств данной модели. Ключ к тому, что он независим от модели, и я почти там (я думаю), но я продолжаю работать, чтобы привязка работала правильно.Связанная итерация через свойства модели

Вот установка ... шаблон action.hbs делает ссылку на мой компонент и переходит в modelMeta собственности (подробнее об этом в сек):

{{model-admin-form 
    model=content 
    meta=modelMeta 
}} 

В контроллере (ActionController) Я определяю modelMeta собственность как:

modelMeta: function() { 
    var vals = []; 
    var attributeMap = this.get('content.constructor.attributes'); 
    var self = this; 
    attributeMap.forEach(function(name, value) { 
     item = Ember.Object.create({ 
      name: value.name, 
      type: value.type, 
      value: self.get('content.' + name) 
     }); 
     vals.push(item); 
    }); 
    return vals; 
}.property('content'), 

Это дает мне массив всех свойств в модели и для каждого это дает мне «имя», «тип» и «значение». Это отлично работает, за исключением того, что «значение» не привязано к модели. Хорошо, не проблема, я просто изменим строку назначения на:

valueBinding: self.get('content.' + name); 

Nope. Это не работает. Черт. Почему нет? Ну используя Ember инспектор, я могу видеть, что valueBinding настроен, но это _from свойство кажется слегка подвыпивший:

Я бы ожидал, что это указывает на что-то вроде «controllers.actions.content ...» или что-то на этот счет. Вместо этого значение «Alt Gained» является фактическим строковым значением свойства, но не ссылкой привязки.

Может ли кто-нибудь мне помочь?

= - = - = - = - = - = - = - ОБНОВЛЕНИЕ = - = - = - = - = - = - = -

Я обновил пример немного, чтобы сделать более ясным и добавьте немного контекста. Конечной целью этого упражнения является предоставление вычисленного свойства modelMeta, которое представляет собой массив, в котором каждый элемент массива представляет метаинформацию для свойства в модели. Метаинформацию захвачена является:

  • имя: имя свойства
  • типа: тип переменного (например, строка, числа и т.д.)
  • значение/valueBinding: связанная ссылка на именованном свойство по образцовой записи

Первые две части - торт. Последний - сложная часть. Получение несвязанного значения тривиально, но привязка к нему кажется сложной.

ответ

1

Вы можете попробовать:

var record = self.get('content'); // yes? 
... Object.create({ 
    valueBinding: 'record.' + name, 
    record: record // give the binding something to bind against 
}); 

Вот что происходит неправильно в вашем коде:

value: self.get('content.' + name) получает значение свойства слишком рано, возможно, до того, как экземпляр модели заполняется. Он определенно не будет обновляться, если атрибут модели изменится.

valueBinding: self.get('content.' + name) не работает, потому что он пытается установить привязку к любому значению свойства. Скажем name is 'email', то self.get('content.' + name) может быть '[email protected]', поэтому value теперь привязано к свойству под названием '[email protected]' (что всегда не определено).

+0

Awesome. Работал как шарм. Спасибо Джо. – ken

0
var metaObject = Ember.Object.extend({ 
    value: Ember.computed.alias('item.name') 
    //^same as saying valueBinding: 'item.name' 
}); 


// Then in your model 

modelMeta: function() { 
    var attributeMap = this.get('content.constructor.attributes'); 
    var self = this; 
    return attributeMap.map(function(name, value) { 
    metaObject.create({ 
     item: item 
    }) 
    }); 
}.property('content') 

Не уверен, что я включил все свойства, которые вы хотите, но вы получите идею с вышесказанным. Передайте элемент в экземпляр create() и определите привязки элементов в определении класса.

+0

Я пробовал это, но безрезультатно. На самом деле это похоже на шаг назад только потому, что я больше не вижу привязки к Ember Inspector (не то, что мне было бы интересно, если бы это сработало). Позвольте мне добавить немного больше контекста к проблеме выше, поэтому ее яснее. – ken

+0

Теперь я обновил этот пример. Из вашего первоначального ответа я думаю, что я не был достаточно ясен, что «value.name», исходящее из атрибута «атрибут», является именем свойства модели, которое затем используется как смещение для «получения» соответствующего значения из модель. Вот что я хочу привязать к атрибуту 'value'' item'. – ken

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