Ember.js:在模型中迭代对象的正确方法?

时间:2013-07-15 01:37:44

标签: javascript object model-view-controller model ember.js

在按照一些教程练习后,我正在开发我的第一个EmberJS应用程序。它只包含一个类似于数据库的“表”,“列”和“行”列表。

链接到有问题的页面:http://www.kangarooelectronics.com/fakeDB/#/tables/edit/2

我的问题是,当我去删除列时,我得到: 对象#没有方法'deleteRecord' 据我所知,这是由于我正在迭代没有引用控制器的对象,因为我正在构建用于创建列表的数组的方式。

删除表工作正常,以下列方式列出:

{{#each model itemController='TableList'}}
    <a {{action removeTable this}}>Delete</a>
{{/each}}

我通过以下方式遍历列:

{{#each column in currentColumns itemController='TablesEdit'}}
    <a {{action removeColumn column}}>Drop</a>
{{/each}}

来自FIXTURES对象的片段:

FakeDB.Table.FIXTURES = [
    {
        id: 1,
        name: 'Users',
        columns: {
            1:{'colId':1, 'name':'name'},
            2:{'colId':2, 'name':'favorite color'},
            3:{'colId':3, 'name':'phone number'}
        },
// ...snip... //

我通过以下方式获取'currentColumns':

FakeDB.Table = DS.Model.extend({
    name: DS.attr('string'),
    columns: DS.attr('object'),
    rows: DS.attr('object'),
    currentColumns: function() {
        var newColumns = $.map(this.get('columns'), function(k, v) {
            return [k];
        });
        return newColumns;
    }.property('columns'),
// ..snip.. //

在这里你可以看到我的问题......很明显,我的'专栏'不会有来自我的控制器的任何方法。我试过这样的事情:

FakeDB.Adapter = DS.FixtureAdapter.extend();

FakeDB.Adapter.map('FakeDB.Table', {
    columns: {embedded: 'load'},
    rows: {embedded: 'load'}
});

FakeDB.Columns = DS.Model.extend({
    colId: DS.attr('integer'),
    name: DS.attr('string')
});

FakeDB.Rows = DS.Model.extend({
    colId: DS.attr('integer'),
    name: DS.attr('string')
});

但是我无法使用{{#each column in columns}}来处理它。

有什么建议吗?我将再次阅读文档,如果找到解决方案,我会回复。 谢谢!

编辑: 所以我认为我找到了另一种解决方案,但我仍然遇到了一个小问题。

FakeDB.Table = DS.Model.extend({
    name: DS.attr('string'),
    columns: FakeDB.Columns.find().filter(function(item, index, self) {
        if(item.tableID == 1) { return true; }
    })
});

仍然不确定要替换'item.tableID == 1',以便我获得带有引用当前页面的tableID的项目......

列的结构为......

FakeDB.Columns.FIXTURES = [
    {
        id: 1,
        tableID: 1,
        name: 'name'
    },
// ...snip... //

但现在我得到: 断言失败:您的应用程序没有定义“Store”属性。尝试在模型类上调用'find'将失败。请提供一个'YourAppName.Store = DS.Store.extend()'

我实际上正在定义一个“商店”属性......

1 个答案:

答案 0 :(得分:1)

  

在按照一些教程练习后,我正在开发我的第一个EmberJS应用程序。它只包含一个类似于数据库的“表”,“列”和“行”列表。

大多数数据库都包含表,行和列的列表。大多数Web应用程序包含一组固定的表,其中包含预定义的列和动态的行列表。如果这是你的第一个余烬应用程序,我会建议从让你走在快乐道路上的东西开始。

  

我实际上正在定义一个“商店”属性......

真实,但是抱怨是抱怨,因为在初始化ember应用程序之前商店不可用。访问商店的任何东西都应该在某种框架钩子中。在定义对象时不能使用它,这无论如何都没有多大意义。

你的意思可能就是制作一个名为columns的计算属性:

FakeDB.Table = DS.Model.extend({
  name: DS.attr('string'),
  columns: function() { 
    FakeDB.Columns.find().filter(function(item, index, self) {
      if(item.tableID == 1) { return true; }
    })
  }.property('')
});