Ember.js:从ArrayController中删除对象

时间:2014-05-05 14:02:16

标签: javascript ember.js

我有一个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

我对两点感到困惑:

  1. 当我在ArrayController上输出content的内容时,它将单页显示为模型(App.Page)的子类,其中Ember ID为667.当我在索引处查看对象时带有this.objectAt(0)的内容数组的0,它显示的不是模型,而是页面的项目控制器,Ember ID为668.这两个输出不应该相同吗? / p>

  2. 为什么findProperty方法返回undefined?对于其他方法也是如此,例如findBy。我看到Ember.ArrayController扩展了Ember.ArrayProxy,然后依次使用Ember.MutableArray。我已经读过你不能对Ember-Data中的 immutable 数组做这类事情。

  3. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

当您迭代ArrayController,或尝试通过ArrayController从集合中访问项目时,它将返回包含项目控制器的模型。如果您从控制器上的模型/内容进行迭代或尝试获取,则只返回模型。

通常在使用ArrayControllerObjectController时,您不需要使用contentmodel。这是因为两个控制器都是代理控制器,它将请求代理到它正在装饰的模型/内容。

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(尽管存在未定义的问题,我会尝试快速复制)。

此外,您的操作addPageremovePage应位于操作哈希值中。

actions: {
  addPage: function(){...},
  removePage: function(){...},

}

问题

真正的问题是您的itemController正在延长Ember.ControllerEmber.Controller不是代理控制器,它是一个假定没有模型支持它的控制器,因此它不会代理请求代理。您只需要将其更改为Ember.ObjectController即可。

示例:

http://emberjs.jsbin.com/wulosufu/2/edit