2013-12-16 2 views
1

Я хочу иметь вычисленное свойство в классе, которое зависит от свойства (массив строк) того же класса. Я хочу, чтобы это вычисляемое свойство зависело только от определенного элемента массива.Вычисленное свойство Ember.js с зависимостью от элемента свойства массива

На самом деле, я бы не прочь, если это зависит от всех элементов массива.

Я Тлеющей определяется следующим образом:

var UpdateController = Ember.ArrayController.extend({ 

    PANE_1:  0, 
    PANE_2:  1, 
    PANE_3:  2, 

    init: function() { 
     this._super(); 
     this.set('paneClass', ["center", "right", "right"]); 
    }, 

    channelsPaneClass: function() { 
     return this.get('paneClass')[this.get('PANE_1')]; 
    }.property('[email protected]'), 
} 

Это вычисленное свойство используется в шаблоне следующим образом:

<div {{bind-attr class=":sf-seg-pane channelsPaneClass"}}></div> 

Это выводит следующий HTML:

<div class="sf-seg-pane center"></div> 

Пока, так хорошо. Однако, если я теперь изменить значение элемента paneClass[PANE_1], например так:

this.get('paneClass')[this.get('PANE_1')] = "xxx"; 

Я ожидавшую HTML, чтобы изменить в:

<div class="sf-seg-pane xxx"></div> 

Но это не так.

Что еще я пробовал:

  1. Я пытался указать зависимость свойства как .property('paneClass').
  2. Я пробовал использовать {{bind-attr class=":sf-seg-pane paneClass[0]"}} в шаблоне.
  3. Я видел this, в котором описывается способ сделать это, когда наш массив представляет собой массив объектов. Я не вижу никакого примера для массива примитивных типов данных.

ответ

2

Я рекомендую вам использовать paneClass.[] вместо [email protected] потому [email protected] намерен соблюдать некоторые свойства из объекта в массиве , Также добавьте PANE_1 в property, так как это зависимый ключ.

var UpdateController = Ember.ArrayController.extend({ 
    PANE_1:  0, 
    PANE_2:  1, 
    PANE_3:  2, 
    init: function() { 
     this._super(); 
     this.set('paneClass', ["center", "right", "right"]); 
    }, 
    channelsPaneClass: function() { 
     return this.get('paneClass')[this.get('pane1')]; 
    }.property('paneClass.[]', 'PANE_1'), 
} 

И уведомлять наблюдателей, что массив изменил вам нужно использовать array.insertAt(index, content) вместо array[index] = content. В вашем случае:

this.get('paneClass').insertAt(this.get('PANE_1'), "xxx"); 
+0

Работает как очарование! Спасибо за ваше время. Если вы не возражаете, это где-то документально. Я работаю в течение нескольких часов. Наконец, я использовал обходные пути с участием объектов, описанных здесь: http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/ –

+0

Добро пожаловать. О 'insertAt' единственное место, которое я знаю, это [документация] (http://emberjs.com/api/classes/Ember.MutableArray.html#method_insertAt). –

+0

Извините, я имел в виду синтаксис 'paneClass. []'. –

0

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

+0

Как использовать сеттер для элемента массива? Если бы это был объект, я бы использовал this.set ('paneClass', "xxx"). Но 'paneClass' - это массив, и я хочу установить его 0-й элемент в« xxx ». –

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