【问题标题】:Child controller observers still active after route change路由更改后,子控制器观察者仍处于活动状态
【发布时间】:2013-12-14 20:49:07
【问题描述】:

我目前正在使用 EmberJS 开发地图应用程序,使用 ember-leaflet 来显示地图。请参阅此 jsFiddle 了解我当前的设置:

http://jsfiddle.net/HUnnr/1/

我的问题是,我没有将点击事件委托给PlacesNewController,只有当/places/new 路由打开时。

我的第一次尝试MapView -> PlacesController -> PlacesNewController 委托click 事件,但在我更改路线后,这也处理了点击事件并向地图添加了一个标记,因为PlacesNewController 还活着.

我的第二次尝试 然后我尝试了 Embers Evented mixin。在我从MapView -> PlacesController 委托事件之后,我触发了一个事件。我将PlacesNewController 绑定到PlacesNewRoute.activate 上的此事件并在PlacesNewRoute.deactivate 上取消绑定它。主要问题是,我无法从事件处理函数中访问PlacesNewController 的模型。

上述两种解决方案似乎都不是“余烬之道”。我认为对于这样的事情有更好的解决方案。也许有人可以帮我解决这个问题。我认为,直接将地图事件委托给PlacesNewController 之类的方法是最简洁的解决方案,但我不知道如何使用 Ember 实现这一点。

编辑: 这是一个新的jsBin: http://emberjs.jsbin.com/uHOPOfi/23/edit

主要问题是,如果您第一次访问 /places 路由,正如预期的那样,zoomisCloseEnough 的观察者不会被调用。之后,您转到/places/new,观察员正在按预期工作。但我不明白的是,为什么在回到/places 之后,观察者以及与他们一起的PlacesNewController 仍然活跃?我以为 Ember

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    向控制器发送一个动作。

    您可以通过控制器反弹动作。

    (抱歉,切换到 jsbin,jsfiddle 不适合我的屏幕)

    http://emberjs.jsbin.com/AguxORAD/3/edit

    就我个人而言,我会放弃新的路由/控制器,这似乎很奇怪,因为所有真正的逻辑都存在于某个地方,并且您必须来回代理信息,但这取决于您。

    【讨论】:

    • 感谢您的帮助,这接近我的“第一次尝试”,但是仍然存在这个问题,在我回到/places 路由或到另一条路线,如我的问题中所述。
    • 只是出于好奇,为什么要把它放在不同的控制器中?
    • 我首先认为路由处理控制器创建,然后事件仅对新的(在地图上创建标记)路由有效。我还有一些逻辑,比如添加标题、描述等,所以我想为此分离逻辑。如果您对应用程序布局有更好的解决方案,那么欢迎。
    • 控制器的寿命很长,它们不仅仅存在于路由中。这就是为什么可以在访问使用它的路由之前获取和使用控制器的原因。
    【解决方案2】:

    根据主销的回答和this video 的提示,我找到了一个很好的解决方案。要点是,视图中的每个事件都会命中当前路线。所以地图总是委托点击事件。但随后可以处理取决于PlacesRoutePlacesNewRoute 的路线。所以PlacesNewController 执行所有位置创建逻辑,PlacesController 执行索引逻辑等等。我认为目前这是一个很好的起点。

    这里是jsFiddle,它显示了我上面描述的当前解决方案。

    @kingpin:谢谢你的帮助

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      相关资源
      最近更新 更多