2015-10-10 2 views
0

Я всегда читал, что Ember отлично работает с POJO вместо Ember Data, но теперь, когда я делаю это, у меня небольшие проблемы.Просмотр не обновляется после нажатия нового POJO ember

Я создаю приложение, использующее NW.js и LinvoDB для базы данных. Извлечение из БД легко и прекрасно работает:

// route/index 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model: function() { 
     var gui = require('nw.gui'); 
     var linvoDB = require('linvodb3'); 
     linvoDB.defaults.store = {db: require('medeadown')}; 
     linvoDB.dbPath = gui.App.dataPath; 
     var File = new linvoDB('file', {}); 
     var Tags = new linvoDB('tag', {}); 

     var media = new Promise(function(resolve, reject) { 
      var query = File.find().sort({ctime: -1}).live(); 

      File.on('liveQueryUpdate', function() { 
       resolve(query.res); 
      }); 
     }); 

     var tags = new Promise(function(resolve, reject) { 
      var query = Tags.find().sort({name: 1}).live(); 

      Tags.on('liveQueryUpdate', function() { 
       resolve(query.res); 
      }); 
     }); 

     return Ember.RSVP.hash({ 
      media: media, 
      tags: tags 
     }); 
    } 
}); 

У меня есть простое мероприятие, которое проходит, чтобы создать тег, сохранить его и толкать его в модель:

//controllers/index 
actions: { 
    viewMedia: function(media) { 
     this.transitionToRoute('media', media) 
    }, 
    addTag: function() { 
     var linvoDB = require('linvodb3'); 
     var gui = require('nw.gui'); 
     linvoDB.defaults.store = {db: require('medeadown')}; 
     linvoDB.dbPath = gui.App.dataPath; 

     var Tag = new linvoDB('tag', {}); 
     var tag = new Tag(); 
     tag.name = this.get('tagName'); 
     tag.save(); 
     this.get('model.tags').push(tag); 
    } 
} 

я могу проверить, что тег правильно вставлен в массив тегов в модели, но представление не обновляется. Из того, что я читал, это потому, что я не использую Ember.Object.

Как вы можете это сделать с помощью POJO или мне нужно использовать Ember.Objects? Благодарю.

ответ

0

Ember обеспечивает собственную реализацию массива в Ember.Array/Ember.MutableArray, что добавляет много отличных вещей, например, как должным образом наблюдаемых в экосистеме Ember. В частности, Ember.MutableArray (или, скорее, Ember.MutableEnumerable) имеет метод под названием pushObject(obj), который Push the object onto the end of the array., а также уведомляет подписчиков.

Поскольку Ember также достаточно хорош, чтобы добавить их в обычный прототип Arrays, чтобы облегчить людям движение, вы должны просто сделать this.get('model.tags').pushObject(tag); в своем коде.

+0

Да, я подумал об этом, но я получаю сообщение «Uncaught TypeError: undefined is not a function», когда я пытаюсь использовать 'pushObject' вместо' push'. – NicholasJohn16

+0

Тогда звучит так, что расширения прототипов не добавляются должным образом при запуске в nw.js. К счастью, есть решение для этого, измените свой модельный код, чтобы обернуть свой результат в Ember.A(), чтобы получить правильный Ember.Array напрямую, 'Tags.on ('liveQueryUpdate', function() {resolve (Ember .A (query.res));}); ' –

+0

Спасибо. Это подтолкнуло меня в правильном направлении. Я думаю, что мне нужно будет адаптировать Ember Data адаптер, чтобы это действительно работало. – NicholasJohn16

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