Ember.js中的仪表板样式快速编辑

时间:2014-07-28 00:09:38

标签: ember.js

我正在尝试使用Ember为我的Rails应用程序制作管理员后端。

这是一个JsBin,说明了我遇到的问题。

http://emberjs.jsbin.com/titix/20/edit

简而言之,我希望能够在用户点击它时在其他模型列表中编辑任意模型的标题。

相关的CoffeeScript以及评论中的问题:

App.ItemView = Ember.View.extend
  templateName: "item"
  isEditing: false

  didInsertElement: ->

    # 1. Is there a better way to toggle the isEditing property when the title is clicked?
    view = @ 
    @$('.title').click ->
      view.toggleProperty('isEditing')

    # 2. How would I unset isEditing when the user clicks on a different App.ItemView? 

# 3. How do I set App.ItemController to be the controller for App.ItemView?
App.ItemController = Ember.Controller.extend

  # 4. How would I then toggle the isEditing property of App.ItemView on either save of cancel from App.ItemController?
  actions:
    save: ->
      # set isEditing is false on App.ItemView
      @get('model').save()
    cancel: ->
      # set isEditing is false on App.ItemView
      @get('model').rollback()

对任何这些问题的任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

Here is a working bin 在以下条件下切换表单项的状态,单击保存按钮,单击取消按钮并单击另一项。

每次点击某个项目时,我都会将项目视图参考保存到索引控制器。单击其他项目时,我使用a beforeObserver将之前的项目视图状态设置为false。

我还在模板中指定了项目控制器。

App.IndexController = Em.ObjectController.extend({
  currentEditingItem: null,

  currentEditingItemWillChange: function() {
    if(this.get('currentEditingItem')) {
      this.set('currentEditingItem.isEditing', false);
    }
  }.observesBefore('currentEditingItem'),
});

App.ItemController = Ember.Controller.extend({
  needs: ['index'],

  formController: Em.computed.alias('controllers.index'),

  currentEditingItem: Em.computed.alias('formController.currentEditingItem'),

  actions: {
    save: function() {
      this.set('currentEditingItem.isEditing', false);
      return this.get('model').save();
    },
    cancel: function() {
      this.set('currentEditingItem.isEditing', false);
      return this.get('model').rollback();
    }
  }
});

答案 1 :(得分:1)

好的,让我们看看我是否记得回答所有问题。

首先,我们决定将整个项目集包装在一个数组控制器中(这样我们就可以跟踪所有子项目控制器)。它还允许我们定义项目可以使用的itemController。

  <script type="text/x-handlebars" data-template-name="item-list">
    <h3>{{view.title}}</h3>
    <ul>
      {{render 'items' view.content}}
    </ul>
  </script>


App.ItemsController = Em.ArrayController.extend({
  itemController:'item',
  resetChildren: function(){
    this.forEach(function(item){
      item.set('isEditing', false);
    });
  }
});

其次定义渲染模板({{render 'items' view.content}}将渲染项目模板)

  <script type="text/x-handlebars" data-template-name="items">

      {{#each item in controller}}
        <li>{{view App.ItemView content=item}}</li>
      {{/each}}

  </script>

第三,因为我们遍历控制器,它将使用这个修改过的项目控制器

App.ItemController = Ember.ObjectController.extend({
  isEditing: false,
  isSaving: false,
  actions: {
    startEditing: function(){
      this.parentController.resetChildren();
      this.set('isEditing', true);
    },
    save: function() {
      var self = this;
      this.set('isEditing', false);
      this.set('isSaving', true);
      this.get('model').save().finally(function(){
        //pretend like this took time...
        Em.run.later(function(){
          self.set('isSaving', false);
        }, 1000);
      });
    },
    cancel: function() {
      this.set('isEditing', false);
      this.get('model').rollback();
    }
  }
});

,这是我们的模板

  <script type="text/x-handlebars" data-template-name="item">
    {{#if controller.isEditing}}
      {{input value=controller.title }}
      <button {{ action 'cancel' }}>Cancel</button>
      <button {{ action 'save' }}>Save</button>
    {{else}}
      <div  {{action 'startEditing'}}>
       <div class="title">{{controller.title}}</div>
      </div>
    {{/if}}
    {{#if controller.isSaving}}
      Saving...
    {{/if}}
  </script>

示例:http://emberjs.jsbin.com/jegipe/1/edit