【问题标题】:Is there a way to get access to the Ember model within a nested view?有没有办法在嵌套视图中访问 Ember 模型?
【发布时间】:2013-05-12 01:54:13
【问题描述】:

我正在尝试访问我当前正在编辑的 ember 模型对象的模型。我正在渲染一个视图:

    {{view App.RemarkTextField valueBinding="content"}}

这是视图:

    App.RemarkTextField = Ember.TextField.extend
      focusOut: (evt) ->
        @state = @_context.get("stateManager.currentState")
        if (@state.name == "saved")
          @rollback()

      keyUp: (evt) ->
        @rollback() if evt.keyCode == 27

      rollback: ->
        @._context.transaction.rollback()
        @get('parentView').intoReadMode()

我在父视图上调用 intoReadMode() 以在焦点丢失或逃逸时退出编辑模式,这会从输入恢复为标准文本。

这段代码运行正常,但是调用 this._context 来访问 ember 模型及其当前状态感觉很脏。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: ember.js coffeescript ember-data


    【解决方案1】:

    同意致电this._context 表明事情不太对劲。在这种情况下,您最好通过控制器访问模型。

    App.RemarkTextField = Ember.TextField.extend({
      focusOut: function(evt) {
        console.log('controller', this.get('controller'));
        var state = this.get("controller.stateManager.currentState.name");
        console.log('state', state);  
      }
    });
    

    FWIW 将模型访问和回滚方法移到控制器中可能是有意义的。然后重构 parentView,使其根据控制器的属性进入/退出只读模式。

    App.RemarkTextField = Ember.TextField.extend({
      focusOut: function(evt) {
        this.get('controller').send('rollback');
      },
      keyUp: function() {
        if (evt.keyCode == 27) {
          this.get('controller').send('rollback');
        }
      }
    });
    

    【讨论】:

    • 这里的问题是控制器没有stateManager对象。
    • @Faun 我假设控制器是一个 ObjectController(所以它应该代理模型)并且模型有一个 stateManager。不是这样吗?还假设您将在控制器上定义一个“回滚”方法。控制器将有权访问当前事务/模型,并可以根据需要回滚 tx。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多