在遵循一些教程作为练习之后,我正在开发我的第一个 EmberJS 应用程序。它只包含类似于数据库的“表”、“列”和“行”的列表。
链接到有问题的页面:http ://www.kangarooelectronics.com/fakeDB/#/tables/edit/2
我的问题是,当我去删除一列时,我得到: Object # has no method '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... //
但现在我得到: 断言失败:您的应用程序没有定义“存储”属性。尝试在模型类上调用“查找”将失败。请提供与 'YourAppName.Store = DS.Store.extend()' 相同的一个
我实际上是在定义一个“商店”属性......