【问题标题】:Emberjs: cross-controller binding failing because 'content' doesn't exist yetEmberjs:跨控制器绑定失败,因为“内容”尚不存在
【发布时间】:2013-05-02 10:27:23
【问题描述】:

我正在尝试使用“需要”功能来允许一个控制器从另一个控制器获取值。这是一个 JSFiddle,它在绑定值之前显示了我的应用程序的精简版本:http://jsfiddle.net/kevinwh/WRxnE/4/

App.ApplicationController = Ember.ObjectController.extend({
  init: function() {
    this._super();
  },
  dishClicked: function() {
    console.log('clicked');
    this.incrementProperty('clickCount');
  }
});

App.DishController = Ember.ObjectController.extend({
  needs: ['application'],
  init: function() {
    this._super();
  },
  //clickCountBinding: 'controllers.application.clickCount'
});

基本上,我的 ApplicationController 有一个 clickCount 属性,只要单击其中一个 Dish 链接就会更新(通过操作)。单击链接也会通过 linkTo 激活 DishRoute。

现在我希望包含的 DishController 也可以访问 ApplicationController 的 clickCount。所以我添加了“需要”属性和 clickCountBinding 属性(必须在 JSFiddle 中取消注释)。然后,当我点击链接时,我收到了投诉: 断言失败:无法将 set('clickCount', 0) 委托给对象代理的“内容”属性:其“内容”未定义。

显然,在控制器上设置模型内容之前,绑定已被激活。由于控制器是由 linkTo 设置的,因此不会调用我的 DishRoute.model() 和 DishRoute.setupController() 方法。此外,在绑定错误发生之前,甚至没有调用 DishController.init() 方法。

我考虑过我应该将一个内容成员对象粘贴到类中的可能性(在 JSFiddle 中已注释掉),但这样做会产生一个奇怪的结果:不同链接的点击计数分别增加。有趣,但不是我想要的。

那么 - 我如何在这些控制器之间共享 clickCount 值?是否有其他方法可以在 DishController 中设置内容以便绑定起作用?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    您只是稍微误解了错误消息。
    问题是您已经从ObjectController 子类化了ApplicationController,即使它没有要代理的基础内容对象,在这种情况下您应该只使用用户Ember.Controller。 话虽如此,如果你有一个计数器,你可能应该将它默认为零。

    App.ApplicationController = Ember.Controller.extend({
      clickCount: 0,
      dishClicked: function() {
        console.log('clicked');
        this.incrementProperty('clickCount');
      }
    });
    
    App.DishController = Ember.ObjectController.extend({
      needs: ['application'],
      clickCountBinding: 'controllers.application.clickCount'
    });
    

    【讨论】:

    • 好吧,这使得这个简单的案例起作用了——尽管我发现我需要将 DishController 更改为 Controller,而不是 ApplicationController。但是,我确实需要 DishController 成为 ObjectController(也许我的 JSFiddle 太简单了,无法说清楚)。有没有办法让两个 ObjectController 一起工作?获取细节控制器集的内容似乎是个问题。
    • 如果控制器首先没有内容,您显然无法将属性设置为控制器的内容,但是大多数时候您实际上希望在控制器上设置值。要让它工作,只需在控制器中将值初始化为 null
    • 确实如此。在 DishController did 中为 clickCount 设置一个初始值可以完成这项工作。非常感谢,尽管我不得不承认,这点灰烬魔法让我很困惑。对于看到这个的其他人,工作版本是jsfiddle.net/kevinwh/WRxnE/5
    • 非常感谢您,为非常相似的事情挠头,这对我有帮助。只是想让你知道。
    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2020-04-10
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多