2015-05-07 2 views
1

Я пытаюсь получить эффект переключения в Emberjs для некоторых динамически загружаемых данных. Вот мой адаптер:изменение значения свойства модели emberjs

export default Ember.Object.extend({ 
    findAll: function(){ 
     return ajax('http://localhost:8000/api/v1/address-book/companies?includes=details') 
      .then(function(response){ 
       return response.data.map(function(c){ 
        return { 
         name: c.name, 
         website: c.details.data.website_url, 
         dev_website: c.details.data.development_website_url, 
         showDetails: false 
        }; 
       }); 
      }); 
    } 
}); 

Вот это HTML рули:

{{#each m in model}} 
    <tr> 
     <td > 
      <p style="cursor:pointer; color:#009688" {{ action 'displayDetails' m}}>{{m.name}}</p> 
      {{#if m.showDetails}} 
       <div class=""> 
        <p><strong>Wesbite URL: </strong><a href="{{m.website}}">{{m.website}}</a></p> 
        <p><strong>Development Wesbite URL: </strong><a href="{{m.dev_website}}">{{m.dev_website}}</a></p> 
       </div> 
      {{/if}} 
     </td> 
    </tr> 
{{/each}} 

и вот контроллер:

export default Ember.ArrayController.extend({ 
    searchText: null, 

    actions: { 
     displayDetails: function(item){ 
      item.toggleProperty('showDetails') 
     } 
    } 
}); 

Я также попытался это в моем контроллере:

export default Ember.ArrayController.extend({ 
    searchText: null, 

    actions: { 
     displayDetails: function(item){ 
      item.showDetails = true; 
     } 
    } 
}); 

Который дает мне ошибку I необходимо использовать Ember.set изменить значение свойства шоу, то я сделал это:

export default Ember.ArrayController.extend({ 
    searchText: null, 

    actions: { 
     displayDetails: function(item){ 
      item.set('showDetails', true); 
     } 
    } 
}); 

, но это дает мне ошибку item.set не является функцией

Теперь я пытаюсь переключить модели ShowDetails свойство от true до false каждый раз, когда нажимается название компании (p tag). Я знаю, что я работал с свойствами самого контроллера, но как я могу достичь этого в моем объекте модели?

ответ

0

вам нужно либо:

1) контроллер элемент (скоро устареет)
- смотрит в апи «потребностей» для контроллеров
2) компонента, который вы можете установить свойство на.

Вы не можете установить свойство модели для отдельного объекта с помощью Array Controller.

Если вы имели тождественное, вы могли бы сделать что-то вроде:

actions: { 
    actionName: function() { 
    this.store.find('modelName', someID).toggleProperty('propertyName') 
    } 
} 
0

В адаптере у вас есть возврат следующим образом:

return response.data.map(function(c){ 
    return { 
     name: c.name, 
     website: c.details.data.website_url, 
     dev_website: c.details.data.development_website_url, 
     showDetails: false 
    }; 
}); 

Это означает, что вы возвращаете массив простых объектов JavaScript, которые не реализовали #set метод непосредственно на них. Ember предоставляет Ember.set, который может использоваться как на объектах Ember, так и на JavaScript-объектах. Что более важно, оно совместимо с механизмом привязки Ember и, вероятно, именно по этой причине вы получили предупреждение.

Чтобы сделать объекты возврата более гибкими в средах Ember, рассмотрите их обертывание в классе Ember Object. Таким образом, вы бы прямо выполнили #set, #get и #togglePropert метод.В качестве примера:

return response.data.map(function(c){ 
    return Ember.Object.create({ 
     name: c.name, 
     website: c.details.data.website_url, 
     dev_website: c.details.data.development_website_url, 
     showDetails: false 
    }); 
}); 

More info about Ember.set

More info about #togglePropert