gpt4 book ai didi

ember.js 从 subview 和 Controller 内过渡到路由

转载 作者:行者123 更新时间:2023-12-02 08:02:06 24 4
gpt4 key购买 nike

我有一个从路线自动渲染的模板。 Handlebars 模板指定一个 subview 。

subview 在我的js中有一个扩展 View ,它指定要使用的 Controller 。它还具有引发事件的单击处理程序。 Controller 处理该事件。

到目前为止,这有效 - 问题是 Controller 尝试调用...

this.transitionToRoute("about")

由于某种原因,这不起作用。

我还在主视图上处理单击事件,并在其 Controller 中使用完全相同的方法,并且确实有效。 那么有什么区别呢?我该怎么做才能处理这种转变?

示例:http://jsfiddle.net/b6xsk/4/

在示例中,您可以看到单击索引有效,而单击 subview 则无效。

下面的代码与 fiddle 匹配。

我的模板...

<script type="text/x-handlebars">
{{#linkTo "index"}}Index{{/linkTo}}
{{#linkTo "about"}}About{{/linkTo}}
<div class="app-template">
{{outlet}}
</div>
</script>

<script type="text/x-handlebars" data-template-name="index">
<h1>Index (click me)</h1>
{{view App.ChildView}}
</script>

<script type="text/x-handlebars" data-template-name="about">
<h1>About</h1>
</script>

<script type="text/x-handlebars" data-template-name="childview">
<h2>Child View (click me)</h2>
</script>

然后是我的 JS...

App = Ember.Application.create();

// two simple routes
App.Router.map(function() {
this.route("index");
this.route("about");
});

// index controller handles event and moves to about route
App.IndexController = Ember.Controller.extend({
useraction: function(event) {
console.log("User Action");
this.transitionToRoute("about"); // works !
}
});

// index view handles the click and raises event (handled by controller)
App.IndexView = Ember.View.extend({
click: function(event) {
this.get('controller').send('useraction', event);
}
});

// handles child event and tries (but fails) to transition to about route
App.ChildViewController = Ember.Controller.extend({
childuseraction: function(event) {
console.log("Child User Action");

// do some validation or other code and maybe then transition
// in this example always transition

this.transitionToRoute("about"); // doesn't work ! why??

event.stopPropagation(); // don't allow the event to bubble
}
});

// instantiated so we can attach to view below
App.childViewController = App.ChildViewController.create();

// child view is added in the index handlebar template and raises
// event on click that is handled by child view controller
App.ChildView = Ember.View.extend({
templateName: 'childview',
controller: App.childViewController,
click: function(event) {
this.get('controller').send('childuseraction', event);
}
});

最佳答案

区别在于indexController具有对应用程序路由器的引用,但您创建的childViewController没有对所述路由器的引用。您应该让 Ember 为您创建 Controller ,您可以按如下方式执行此操作。

删除 ChildView 中的 childController 创建和 Controller 规范。

将以下内容添加到您的IndexController

needs: ['childView'] // Can be a string if you only need one other controller

这将使 Ember 为您创建 Controller ,并将其添加到 indexController 的 Controller 集合中。然后,您可以在索引模板中指定 controllerBinding,如下所示。

{{view App.ChildView controllerBinding="controllers.childView"}}

更详细的解释可以在这里找到Managing dependencies between controllers在这里darthdeus vs Ember.js: Controller's Needs Explained

关于ember.js 从 subview 和 Controller 内过渡到路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com