控制器在ember.js中发送动作上下文

时间:2015-04-24 07:36:51

标签: ember.js

  

Ember:1.11.3

     

Ember数据:1.0.0-beta.16

     

jQuery:1.11.2

我试图将一个动作从一个控制器转移到另一个

控制器A正试图触发控制器B上的操作:

A{
  needs: ['B'],
  actions: {
    foo: function(bar) {
      this.get('controllers.B').send('foo', bar);
    },
  }
}

B{
  actions: {
    foo: function(bar) {
      console.log("foo bar");
    },
  }
}

按照预期工作,当我引用更多控制器时,会出现问题:

A{
  needs: ['B'],
  actions: {
    foo: function(bar) {
      this.get('controllers.B').send('foo', bar);
    },
  }
}

B{
  needs: ['C'],
  name: null,
  init: function () {
    this.get('controllers.C').addObserver('name', this, function (sender) {
      this.set('name', sender.get('name'));
    });
  },
  actions: {
    foo: function(bar) {
      console.log("foo bar: " + name);
    },
  }
}

C{
  name: "hello from C",      
}

现在,当我打电话给B.foo(酒吧)时,我得到了:

  

foo bar:你好,来自C

当我打电话给A.foo(酒吧)时,我得到:

  

foo bar:null

当我在函数中放置断点时,在最后的情况下,名称被定义,在第二种情况下(使用C)。 name为null

我想我有上下文问题,但无法找到......

编辑:上下文

我正在构建地图应用程序。我有一个数据控制器和视图。然后我有另一个视图和控制器负责在地图上绘图。当我添加数据时。

enter image description here

它基本上是CRUD。当我点击绿色项目时,我想向绘图控制器发送一个动作来打电话给他,以便在地图上添加该项目。

我想做什么:

  //app/controllers/map-data.js
  actions: {
    positionItem: function(item) {
      this.get('draw').send('toggleDraw', 'Point');
    },
  }

  //app/controllers/map-draw.js
  actions: {
    toggleDraw: function (state) {
      this.set('mtgDrawState', state);
    },
  }

我希望尽可能在地图绘制控制器和地图数据控制器中绘制数据。

我最终得到了什么(我不能保持这样)

  actions: {
    positionItem: function(item) {
      $('.map-draw-point').click();
    },

1 个答案:

答案 0 :(得分:0)

B{
  needs: ['B'],
  name: null,
  init: function () {
    this.get('controllers.C').addObserver('name', this, function (sender) {
      this.set('name', sender.get('name'));
    });
  },
  actions: {
    foo: function(bar) {
      console.log("foo bar: " + name);
    },
  }
}

应该是:

B{
  needs: ['C'],
  name: null,
  init: function () {
    this.get('controllers.C').addObserver('name', this, function (sender) {
      this.set('name', sender.get('name'));
    });
  },
  actions: {
    foo: function(bar) {
      console.log("foo bar: " + name);
    },
  }
}