在运行时动态创建和删除Ember模型

时间:2014-12-05 03:21:43

标签: dynamic ember.js ember-data

我已经在这方面工作了几天,并决定咬紧牙关并寻求帮助。

我正在使用ember-cli,我正在尝试基于某些元数据在运行时动态创建Ember模型。一个示例用例是用户想要指定数据集(查询,文件等);我想阅读用户的数据文件,并根据文件的结构设置模型。

我已经成功设置了一个使用Ember Data和Fixtures的ember-cli应用程序(为简单起见)。我的静态示例有三个模型,当我使用Chrome Ember调试器时,我可以看到商店中的模型和数据。

现在我的动态示例......

通过在IndexRoute

中设置模型,我已经能够在运行时成功定义模型
var IndexRoute = Ember.Route.extend({

    init: function() {
        // Create a simple model dynamically
        var MyModel = DS.Model.extend({
            defineAttributes: function(){
                Ember.defineProperty(this, 'col1', DS.attr()); 
                Ember.defineProperty(this, 'col2', DS.attr()); 
                Ember.defineProperty(this, 'col3', DS.attr());      
            }.on('init')
        });

        // insert some data into our model
        MyModel.reopenClass({
          FIXTURES: [
            {
                id: '1',
                col1: "key1",
                col2: "value1",
                col3: "value2"
            }, 
            {
                id: '2',
                col1: "key2",
                col2: "value1",
                col3: "value2"
            },             
            {
                id: '3',
                col1: "key3",
                col2: "value1",
                col3: "value2"
            }       
          ]
       });  
    }
});

问题在于我看不到模型的放置位置,也没有出现在数据(商店)的Chrome调试器中。

如果我将MyModel的定义更改为Ember.Application.MyModel,那么我可以看到模型在控制台的Ember.Application下定义,但它仍然对Ember调试器不可见。< / p>

然后我尝试扩展上面的示例以添加model挂钩,如下所示:

var IndexRoute = Ember.Route.extend({

    init: function() {
        ...
    },
    model: function() {
        return this.store.findAll('my-model');
    }
});

但是this.store.findAll('my-model')的调用在两种情况下都失败了。我假设我没有正确接线。

在我的示例中,我也知道我的Model的名称也不是动态的,所以我真的想知道如何在运行时以编程方式为我的模型创建名称。

我非常感谢那些对框架更有经验的人提供的一些帮助或指导,因为我对Ember以及整个配置方法的印象非常深刻。

谢谢,

戴夫

1 个答案:

答案 0 :(得分:1)

你实际上是在定义一些东西,然后扔掉它。您需要将它附加到应用程序的命名空间(如果您使用的是Ember-cli,则可以在索引文件或配置文件中看到它)。

此外,我怀疑init上的定义属性是否有效,但实际上并不是必需的。

第三,你真的想使用Ember Data吗? Ember Data非常自以为是,听起来你不想定义东西。