推送新 POJO 后视图未更新 ember

View doesn't update after pushing new POJO ember

我一直读到 Ember 使用 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?谢谢

Ember 在 Ember.Array/Ember.MutableArray that adds a lot of nifty things, like being properly observable in the Ember ecosystem. The Ember.MutableArray in particular (or rather Ember.MutableEnumerable if you want to go deep) has a method called pushObject(obj) 中提供了自己的数组实现,Push the object onto the end of the array. 并通知所有订阅者。

由于 Ember 也足够好,可以将这些添加到常规数组原型中以方便人们开始使用,因此您应该能够在代码中简单地执行 this.get('model.tags').pushObject(tag);