2015-09-11 2 views
2

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

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    allPermissionChanged: function() { 
     alert('!'); 
    }.observes('hash.types.[].permissions'), 
    permissionsHash: { 
    orders:{ 
     types: [ 
     { 
      label: 'All', 
      permissions: { 
      view: true, 
      edit: false, 
      assign: false, 
      "delete": false, 
      create: true 
      } 
     }, 

     } 
     ], 
     permissions:[ 
     { 
      label:'Просмотр', 
      code:'view' 
     }, 
     { 
      label:'Редактирование', 
      code:'edit' 
     }, 
     { 
      label:'Распределение', 
      code:'assign' 
     }, 
     { 
      label:'Удаление', 
      code:'delete' 
     }, 
     { 
      label:'Создание', 
      code:'create' 
     } 
     ] 
    } 
    } 

}); 

Далее я пытаюсь связать каждую установку для ввода

<table class="table table-bordered"> 
    <thead> 
    <tr> 

     {{#each hash.types as |type|}} 
      <th colspan="2">{{type.label}}</th> 
     {{/each}} 
    </tr> 

    </thead> 
    <tbody> 
    {{#each hash.permissions as |perm|}} 
     <tr> 
      {{#each hash.types as |type|}} 
      {{#if (eq (mut (get type.permissions perm.code)) null)}} 
       <td>&nbsp;</td> 
       <td>&nbsp;</td> 
      {{else}} 
       <td>{{perm.label}}</td> 
       <td>{{input type="checkbox" checked=(mut (get type.permissions perm.code)) }}</td> 

      {{/if}} 
      {{/each}} 
     </tr> 
    {{/each}} 
    </tbody> 

</table> 

Но наблюдатель не работает.

Также я подготовил Jsbin пример - http://emberjs.jsbin.com/havaji/1/edit?html,js,output

+0

Следует отметить, что вы должны использовать 'Ember.Object.create ({})' вместо объектных литералов, если вы хотите, чтобы свойства объекта были видимыми. – GJK

+0

Я сообщил об этом как о выпуске репо Ember.js GitHub. https://github.com/emberjs/ember.js/issues/12328 –

ответ

0

Вы можете изменить булевы к объектам с Логическим свойством, чтобы вы могли правильно наблюдать значение флажка.

Контроллер:

App.IndexController = Ember.Controller.extend({ 
    testData: Ember.ArrayProxy.create({ 
     content: [ 
      { value: true }, 
      { value: false }, 
      { value: true } 
     ] 
    }), 

    //... 

Шаблон:

{{input type='checkbox' checked=data.value}} 

Наблюдатель:

arrayChanged: Ember.observer('[email protected]', function() { 
    console.log('changed'); 
}) 

Working demo.

+0

Thx u, но он не работает таким образом: http://emberjs.jsbin.com/kelaqu/edit?html,js,output – Costa

3

Вы используете неправильный синтаксис для этого. hash.types.[] следует использовать только в том случае, если вы хотите наблюдать фактический массив, когда что-то добавляется или удаляется из него. Чтобы наблюдать свойство в массиве, вы получаете [email protected].

allPermissionChanged: function() { 
    alert('!'); 
}.observes('[email protected]') 

Вы можете прочитать об этом в Ember Guides.

+0

Can Я использую такие конструкции? 'hash.types. @ Each.permissions.val' – Costa

+2

Нет. Я боюсь, что нет. Я работаю только на один уровень после '@ each'. Что бы я делал в вашем случае, это создать компонент, который обертывает каждый редактор разрешений, который затем может отправить действие до контроллера при изменении значения. Таким образом, каждый компонент может просто посмотреть свой собственный 'permission.val'. –

+0

Thx за помощь и идею! – Costa

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