在Ember中重置具有计算出的单向属性的窗体

Resetting a form with computed oneWay properties in Ember

本文关键字:窗体 属性 计算 Ember      更新时间:2023-09-26

我正在建模一个嵌入在模态中的窗体,当我的路由在控制器中显式调用reset时,我希望它被重置。这就是我在一个模态中管理的形式:

{{#modal-window title='Size management' close='removeModal'}}
  <label>
    <span>Size</span>
    {{input value=width class='width'}}
    <span>X</span>
    {{input value=height class='height'}}
  </label>
  <label>
    <span>Left</span>
    {{input value=left class='left'}}
  </label>
  <label>
    <span>Top</span>
    {{input value=top class='top'}}
  </label>
{{/modal-window}}

这是呈现/管理表单的控制器:

App.SizeEditorModalController = Ember.ObjectController.extend
  width: Ember.computed.oneWay 'model.width'
  height: Ember.computed.oneWay 'model.height'
  top: Ember.computed.oneWay 'model.top'
  left: Ember.computed.oneWay 'model.left'
  reset: ->
    # I'd like to restore the oneWay properties to its default values coming from the bound model

这是显示先前涉及控制器的模式重置的路线。

App.ApplicationRoute = Ember.Route.extend
  actions:
    showModal: (name, model)->
      controller = @controllerFor name
      controller.reset()
      @render name,
        into:   'application'
        outlet: 'modal'
        model:  model
    removeModal: ->
      @disconnectOutlet
        outlet:     'modal'
        parentView: 'application'

当我为表单控件设置一些值时,它们会永远保留在那里,因为我使用的是oneWay属性,我不知道是否存在任何重置这些属性以再次从源绑定获取值的方法。我不希望在单击"保存"按钮之前更新模型。这是一种很常见的情况,我相信Ember有一个简单的方法来实现这一点,但目前我还不知道这是什么方法。

提前感谢

使用模型的回滚功能。如果一个模型脏了,你可以像一样回滚它

/**
If the model `isDirty` this function will discard any unsaved
changes
Example
```javascript
record.get('name'); // 'Untitled Document'
record.set('name', 'Doc 1');
record.get('name'); // 'Doc 1'
record.rollback();
record.get('name'); // 'Untitled Document'
```
@method rollback
*/

所有未保存的更改都将消失。

这可以实现

App.register 'controller:size-editor-modal', App.SizeEditorModalController, { singleton: false }

如果我添加这个,我的控制器不再是单例的,然后每次模态需要时都会创建一个新的实例。然后控制器使用计算的属性,其默认值来自模型。我以为render(http://emberjs.com/api/classes/Ember.Route.html#method_render)方法在传递类似render的模型时会以这种方式运行(http://emberjs.com/api/classes/Ember.Handlebars.helpers.html#method_render)helper有,但它并没有任何作用。不过,当我希望在不需要创建控制器的新实例的情况下重置我的控制器计算的oneWay属性时,我仍然缺少这种情况。