同级项目控制器

时间:2013-03-12 19:46:12

标签: ember.js

我的模板中有类似的代码:

{{#each items itemController="item"}}

有没有办法在其中一个itemController s的实例中引用兄弟itemController

3 个答案:

答案 0 :(得分:0)

我正在删除这个答案,因为回想起来,虽然它在技术上是正确的,但却没有用。

答案 1 :(得分:0)

您需要在父控制器中存储有特定状态的子信息。查看示例

App.Child = Ember.ObjectController.extend({
    isEdited: false,

    actions: {
        toggleEditingMode: function() {
            old = this.get('parentController.currentlyEditing');

            if(typeof old !== "undefined" && old != this) {
                old.set('isEdited', false);
            }

            this.set('parentController.currentlyEditing', this);
        }
    }
});

答案 2 :(得分:0)

项目控制器很快就会消失(请参阅here并搜索itemController)。我建议你为你的用例做的是创建一个组件,如下所示:

App.XItemComponent = Ember.Component.extend({
  classNames: ['item'],

  actions: {
    startEdit: function(){
      this.set('beingEdited', true);
      this.set('disallowEdits', true);
    },
    finishEdit: function(){
      this.set('beingEdited', false);
      this.set('disallowEdits', false);
    }
  }
});

<script type="text/x-handlebars" data-template-name="components/x-item">
  {{ item }} 
  <button {{ action "startEdit" }} {{ bind-attr   
    disabled=disallowEdits}}>Edit</button>
  {{#if beingEdited}}
    <button {{ action "finishEdit" }}>Save</button>
  {{/if}}
</script>

disallowEdits是组件将与所有其他组件共享的属性(通过创建组件的模板的控制器),beingEdited是不与任何人共享的本地组件属性。

然后,您可以按如下方式在模板中使用该组件:

<script type="text/x-handlebars" data-template-name="index">
  <ul>
    {{#each item in model}}
      <li>{{x-item item=item disallowEdits=disallowEdits }}</li>
    {{/each}}
  </ul>
</script>

完整的工作示例here