我有一个ArrayController,它使用itemController来管理一组组件。此示例中的ArrayController表示书籍,项目控制器表示书籍的页面。每个页面都有一个由App.generateId
函数生成的唯一ID。页面的模型为App.Page
。它不使用Ember-Data。
// ArrayController
App.BookController = Ember.ArrayController.extend({
itemController: 'page',
addPage: function (options) {
return this.pushObject(
App.Page.create({
uid: App.generateId('page')
})
);
},
removePage: function (page) {
console.log('Content array: ' + this.get('content'));
console.log('Content array length: ' + this.get('content').length);
console.log('Page UID: ' + page.get('uid'));
console.log('Page at content[0]: ' + this.objectAt(0));
console.log(this.findProperty('uid', page.get('uid')));
}
});
// ItemController
App.PageController = Ember.Controller.extend({});
// Page Model
App.Page = Ember.Object.extend({
uid: ''
});
addPage
方法很好。它被调用并成功创建+向页面添加页面并将其包装在项目控制器中。
我在使用 removePage 功能时遇到问题。这是我在该方法中的控制台日志的输出(添加1页后,尝试删除它):
console.log('Content array: ' + this.get('content'));
//--> Content array: <(subclass of App.Page):ember667>
console.log('Content array length: ' + this.get('content').length);
//--> Content array length: 1
console.log('Page UID: ' + page.get('uid'));
//--> Page UID: page-cm6p6pmmt5aq50i9ej7ona1dsand3mf
console.log('Page at index 0: ' + this.objectAt(0));
//--> Page at index 0: <App.PageController:ember668>
console.log(this.findProperty('uid', page.get('uid')));
//--> undefined
我对两点感到困惑:
当我在ArrayController上输出content
的内容时,它将单页显示为模型(App.Page)的子类,其中Ember ID为667.当我在索引处查看对象时带有this.objectAt(0)
的内容数组的0,它显示的不是模型,而是页面的项目控制器,Ember ID为668.这两个输出不应该相同吗? / p>
为什么findProperty
方法返回undefined
?对于其他方法也是如此,例如findBy
。我看到Ember.ArrayController扩展了Ember.ArrayProxy,然后依次使用Ember.MutableArray。我已经读过你不能对Ember-Data中的 immutable 数组做这类事情。
非常感谢任何帮助。
答案 0 :(得分:1)
当您迭代ArrayController,或尝试通过ArrayController从集合中访问项目时,它将返回包含项目控制器的模型。如果您从控制器上的模型/内容进行迭代或尝试获取,则只返回模型。
通常在使用ArrayController
和ObjectController
时,您不需要使用content
或model
。这是因为两个控制器都是代理控制器,它将请求代理到它正在装饰的模型/内容。
console.log('Content array length: ' + this.get('length'));
console.log('Page UID: ' + page.get('uid'));
console.log('Page at content[0]: ' + this.objectAt(0));
console.log(this.findBy('uid', page.get('uid')));
findProperty
已被弃用,您应该使用findBy
(尽管存在未定义的问题,我会尝试快速复制)。
此外,您的操作addPage
和removePage
应位于操作哈希值中。
actions: {
addPage: function(){...},
removePage: function(){...},
}
真正的问题是您的itemController
正在延长Ember.Controller
。 Ember.Controller
不是代理控制器,它是一个假定没有模型支持它的控制器,因此它不会代理请求代理。您只需要将其更改为Ember.ObjectController
即可。
示例: