0

ember ルートで既にインスタンス化されたコントローラーを使用しようとしています。

コントローラーをインスタンス化して、それをルートで使用したいと思うのは普通のことではありませんか? アプリケーションがコントローラーをインスタンス化した場合、コントローラーをインスタンス化できることはわかってrouter.get("myController")いますが、自分でインスタンス化したコントローラーにはアクセスできません。

ルーターの下部にあるコードを機能させるにはどうすればよいですか?

HTML

 <script type="text/x-handlebars" data-template-name="application">
    {{outlet}}
 </script>


<script type="text/x-handlebars" data-template-name="instanced">
    <h1>Hello from instanced template</h1>
    {{showinstancedvalue}}<hr>
    {{outlet}}
</script>


<script type="text/x-handlebars" data-template-name="foobar">
    <h1>hello from foobar</h1>
    {{foobarvalue}}
</script>

Javascript

var App = Ember.Application.create();
// application view and controller
App.ApplicationView = Ember.View.extend({
    templateName: 'application',
});
App.ApplicationController = Ember.Controller.extend();




// foobar controller and view
App.FoobarController = Ember.Controller.extend({
    foobarvalue: "working"
});
App.FoobarView = Ember.View.extend({
    templateName: 'foobar'
});



// instantiated controller and view
App.InstancedController = Ember.Controller.extend({});
App.instancedController = App.InstancedController.create({
    myvar: "a value from an instantiated controller"
});
App.InstancedView = Ember.View.extend({
    templateName: 'instanced',
});
App.instancedView = App.InstancedView.create({
    showinstancedvalueBinding: 'App.instancedController.myvar'
});

App.instancedView.append();

App.router = Ember.Router.create({
    enableLogging: true,
    root: Ember.Route.extend({
        index: Ember.Route.extend({
            route: '/',
            redirectsTo: 'works'
        }),
        works: Ember.Route.extend({
            route: '/works',
            connectOutlets: function(router) {
                router.get('applicationController').connectOutlet('foobar');
            }
        }),
        broken: Ember.Route.extend({
            route: '/broken',
            connectOutlets: function(router) {

                // no error in console, but foobar doesn't appear
                // router.get('instancedController').connectOutlet('foobar');

                // *** this one was my best guess as to what I thought would work ***
                // no error in console, but foobar doesn't appear
                // App.instancedController.connectOutlet('App.Foobar');

                // Uncaught Error: assertion failed: The name you supplied foobar did not resolve to a view FoobarView
                // App.instancedController.connectOutlet('foobar');
            }
        }),

    })
});

App.initialize(App.router);​
4

2 に答える 2

3

定義を見てくださいconnectOutlet。コメントとして基本的なドキュメントが含まれているため、どのように使用されるか、またはどのように使用されるかをよりよく理解できます。

はテンプレート上にあるapplicationControllerため、基本的には実際に に接続する必要があります。このシナリオでは、フレームワークは、その状態で使用する必要があるビューとコントローラーを見つけ (この場合、引数 'foobar' で指定されているため)、内のコレクション ( という名前) に追加します。のインスタンスに直接接続しようとすると、そのビューでアウトレットが見つかりません (その時点ではインスタンス化されるべきではないと思います)。それからあなたに自分自身を接続します」のようなもの。{{outlet}}ApplicationViewFoobarViewfoobarControllercontrollersapplicationControllerfoobarController

これは、foobar ビュー テンプレート内にアウトレットがあり、このアウトレットを foobar 以外のものに (子状態/ルートとして) 接続する場合に機能します。したがって、アウトレットと名前付きアウトレットについてもっと読む必要があります。

さらに、次のリンクを強くお勧めします。

于 2012-11-13T20:23:10.290 に答える
1

要件を詳しく説明するようにしてください。これは私の観点からは意味がありません。

    broken: Ember.Route.extend({
        route: '/broken',
        connectOutlets: function(router) {
            App.foobarController.connectOutlet('foobar');
        }
    }),

fooBarController で connectOutlet を呼び出しているため、このコードは機能しません。そのため、Assigend ビューで {{outlet}} を検索します。しかし、foobar という名前のテンプレートでは、{{outlet}} が指定されていません。これを修正したとしても、この行はアウトレットを Foobar View の新しいインスタンスに接続しようとするため、まったく意味がありません。つまり、基本的に FooBarController の FooBarView があり、そのビュー内で、アウトレットを FooBarView の新しいインスタンスに再度接続しようとしますか??

したがって、要件の説明がなければ、この質問には答えられません。

于 2012-11-13T18:51:00.560 に答える