简体   繁体   English

如何使用不同的控制器在Ember.js中更新hasMany?

[英]How to update hasMany in Ember.js using different controllers?

How to update hasMany in Ember.js using different controllers? 如何使用不同的控制器在Ember.js中更新hasMany?

Hi 你好

I have Ruby on Rails 4.0.3 app and I am using Ember.js 我有Ruby on Rails 4.0.3应用程序,正在使用Ember.js

DEBUG: Ember      : 1.6.0-beta.3 ember.js?body=1:3917
DEBUG: Ember Data : 1.0.0-beta.7+canary.f482da04 ember.js?body=1:3917
DEBUG: Handlebars : 1.3.0 ember.js?body=1:3917
DEBUG: jQuery     : 1.11.0 

I want to display hasMany in the same view using different controllers. 我想使用不同的控制器在同一视图中显示hasMany

I have seen some example on StackOverflow but most (if not all) of them are for displaying records. 我在StackOverflow上看到了一些示例,但是其中大多数(如果不是全部)都是用于显示记录的。

Ok talk is cheap, I am showing the code: 好吧,谈话很便宜,我在显示代码:

Models: 楷模:

-javascripts/models/task.js -javascripts /模型/ task.js

EmTasks.Task = DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr("string"),
  list: DS.belongsTo('list')
});

-javascripts/models/list.js -javascripts /模型/ list.js

EmTasks.List = DS.Model.extend({
  name: DS.attr('string'),
  tasks: DS.hasMany('task')
});

Router: 路由器:

-javascripts/router.js -javascripts / router.js

EmTasks.Router.map(function(){
  return this.route("lists", {
    path: '/'
  });
});

EmTasks.ListsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('list');
  }
});

Controllers: 控制器:

-javascripts/controllers/lists_controller.js -javascripts /控制器/ lists_controller.js

EmTasks.ListsController = Em.ArrayController.extend({
  addList: function() {
    this.store.createRecord('list', {
      name: this.get('newListName')
    }).save();
    return this.set('newListName', '');
  },

  destroyList: function(id) {
    if (confirm("Are you sure?")) {
      this.get('store').find('list', id).then( function(record) {
        record.destroyRecord();
      });
    }
  },
});

-javascripts/controllers/list_controller.js -javascripts /控制器/ list_controller.js

EmTasks.ListController = Em.ObjectController.extend({
  actions: {
    editList: function() {
      this.set('isEditingList', true);
      var model = this.get('model')
    },
    acceptChanges: function () {
      this.set('isEditingList', false);
      var name = this.get('model.name');

      if (Ember.isEmpty(name)) {
        this.send('removeList');
      } else {
        var list = this.get('model')
        list.set('name', name);
        list.save()
      }
    },
    removeList: function () {
      var list = this.get('model');
      list.destroyRecord();
    }
  },
  isEditingList: false
});

-javascripts/controllers/task_controller.js -javascripts /控制器/ task_controller.js

EmTasks.TaskController = Em.ObjectController.extend({
  isEditingTask: false
});

Templates: 模板:

-javascripts/templates/lists.handlebars [fragment] -javascripts / templates / lists.handlebars [片段]

  {{#each itemController='list'}}

    <div class='col-md-8'>
      <h3>
        {{#if isEditingList}}
          {{edit-input class="form-control" value=name focus-out="acceptChanges" insert-newline="acceptChanges"}}
        {{else}}
          <div {{action 'editList' on='doubleClick'}}>
            {{name}}
          </div>
        {{/if}}
      </h3>
    </div>

    <div class='col-md-4 down13p'>
      <button class="btn btn-danger btn-small pull-right" {{action "destroyList" id}} type="button">
        <span class="glyphicon glyphicon-ban-circle"></span>
      </button>
    </div>

    {{#each task in this.tasks }}

      <div class="col-md-10">
        {{#if task.isEditingTask}}
          {{edit-input class="form-control" value=task.name focus-out="acceptChanges" insert-newline="acceptChanges"}}
        {{else}}
          <div {{action 'editList' on='doubleClick'}}>
            {{name}}
          </div>
        {{/if}}

But is looks like isEditingTask property is not working... 但是看起来isEditingTask属性不起作用...

Any idea how to fix that? 任何想法如何解决?

OK found a solution, just add itemController to tasks each loop 确定找到了解决方案,只需将itemController添加到each循环的任务中

{{#each task in this.tasks itemController='task' }}

  <div class="col-md-10">
    {{#if task.isEditingTask}}
      {{edit-input class="form-control" value=task.name focus-out="acceptChanges" insert-newline="acceptChanges"}}
    {{else}}
      <div {{action 'editTask' on='doubleClick'}}>
        {{name}}
      </div>
    {{/if}}

HTH HTH

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM