1

あるルートでcollection('content')を作成し、それらを別のルートに渡して表示しようとしています。ここで何が問題になっていますか?

エラー:「StartViewのコンテンツが未定義です」

これがコードです

http://jsfiddle.net/insnet/cmBgz/21/

App = Ember.Application.create({LOG_TRANSITIONS: true});
App.ApplicationController = Ember.Controller.extend();
App.ApplicationView = Ember.View.extend({
    templateName: 'application'
});


/* Routing */
App.Router.map(function() {
    this.route("start", {path: '/'});
    this.route("photos");
});

/* Start */
App.StartController = Ember.ArrayController.extend({

    createModels: function() {
        this.set('content', Ember.A());

        this.addObject(Ember.Object.create({id: 1, title: 'Hello'}));
        this.addObject(Ember.Object.create({id: 2, title: 'Digital'}));
        this.addObject(Ember.Object.create({id: 3, title: 'World'}));

        this.transitionToRoute('photos');   
    }
});

/* Photos */
App.PhotosView = Ember.CollectionView.extend({
    contentBinding : 'App.StartController.content',

    didInsertElement : function() {
        console.info("content in StartView", this.get('content'));
    }

});


<script type="text/x-handlebars" data-template-name="application">
  <div class="contrainer">
          <div class="hero-unit">
    <h1>My App</h1>
    {{outlet}}
    </div>
  </div>
</script>

<script type="text/x-handlebars" data-template-name="start">
    <h2>View:Start</h2>
    <button  {{action "createModels"}} class="btn btn-primary">Create models and goto '/photos'</button>
</script>

<script type="text/x-handlebars" data-template-name="photos">
    <h2>View:Photos</h2>
    {{#each controller}}
    <p>{{title}}</p>
    {{/each}}
</script>
4

1 に答える 1

3

私はあなたのフィドルを動作するバージョンに更新しました:http://jsfiddle.net/mavilein/cmBgz/22/

最初は、これはフィドルの間違い/誤解でした:

1-Emberフレームワークによって作成されたインスタンスではなく、コントローラークラスを参照しているため、このバインディングは機能しません。

App.PhotosView = Ember.CollectionView.extend({
    contentBinding : 'App.StartController.content',

2-ビューのログメッセージが間違っていたため、そのように機能しません。ビューの「基礎となるもの」にアクセスする場合は、常にプロパティ「コンテキスト」を使用してください。コンテンツという用語は、コントローラーと組み合わせて使用​​されます。

/* Photos */
App.PhotosView = Ember.View.extend({
    didInsertElement : function() {
        console.info("content in StartView", this.get('context.content'));
    }

});

これはあなたの問題に対する可能な解決策です:

a-これは、startControllerのインスタンスを検索し、そのコンテンツを写真ルート用に生成されたコントローラーのコンテンツとして設定するための可能な方法です。

App.PhotosRoute = Ember.Route.extend({
    model : function(){
        var startController = this.controllerFor("start"); //in routes you have access to controllers with this method
        return startController.get("content");
    }
});

b-別の可能性は、ルートのコントローラーを手動で宣言し、Ember Dependency Injectionを使用することです(おそらく最も「厄介な」ソリューション):

App.PhotosController = Ember.ArrayController.extend({
    needs : ["start"], // "I need the startController plz!" -> accessible via "controllers.start"
})

/* The corresponding each in your template would look like this */
{{#each controller.controllers.start}}
于 2013-02-19T23:30:47.767 に答える