【发布时间】:2024-01-15 21:18:01
【问题描述】:
余烬之道:
根据 ember 的 documentation 关于视图的事件管理器,它们在父类定义中必须是 created,如下所示:
AView = Ember.View.extend({
eventManager: Ember.Object.create({
封装它们并将它们与其父视图(AView)隔离开来。
访问事件上下文的唯一方法是通过与每个event 一起传入的view 参数
dragEnter: function(event, view) {
我的情况:
我在一个包含许多子视图、输入、复选框等的大视图中处理各种拖动事件。 按照这种形式,我的代码开始竭尽全力确定每个事件源自哪个子视图,然后采用不同的路径访问公共父控制器:
drop: function(event, view) {
var myController;
if(view.$().hasClass('is-selected') ||
view.$().hasClass('list-map-container')) {
myController = view.get('controller.controllers.myController');
} else if(view.$().hasClass('ember-text-field')) {
myController = view.get('parentView.parentView.controller');
} else {
myController = view.get('controller');
}
// do work with myController
}
我的秘诀:
为了简化,我在父视图中使用了didInsertElement 挂钩将所需的控制器分配为 eventManager 上的属性:
App.MyView = Ember.View.extend({
didInsertElement: function() {
this.set('eventManager.controller', this.get('controller'));
},
eventManager: Ember.Object.create({
controller: null,
// ...
这可以显着简化我的事件处理程序:
drop: function(event, view) {
var myController = this.get('controller');
// do work with myController
我的问题:
我的直觉告诉我,这种破解方法并不是最好的解决方案。
也许我不应该在 eventManager 中完成所有工作?而是将所有这些工作转移到控制器中,然后将事件从视图中转发出去?
但是如果 eventManager 是一个可接受的工作区,那么访问父视图的控制器的最佳方式是什么?
【问题讨论】:
标签: ember.js