在按照一些教程练习后,我正在开发我的第一个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()'
我实际上正在定义一个“商店”属性......
答案 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('')
});