2

emberjs.com で以下の説明を読んでいて混乱しました。

以下のコードと同じコードを入力しましたが、説明が示すのと同じ結果にはなりません。

以下の説明は多少省略されていると思いますので、誤解や混乱を招きました。

説明の意味を完全に理解するために、以下に示すのと同じ結果を得るための完全なコードを知りたいです。

以下に示す結果を得るために誰かが完全なコードを見せてくれれば、本当に感謝しています。

どうもありがとうございました!

既に見たように、次のようにハンドルバー式または一連の中かっこで囲むことにより、プロパティの値を出力できます。

私の新しい車は{{color}}です。

これにより、ビューの色のプロパティが検索され、出力されます。たとえば、ビューが次のようになっているとします。

App.CarView = Ember.View.extend({ color: 'blue' });

ビューはブラウザに次のように表示されます。

私の新しい車は青です。

グローバル パスを指定することもできます。

私の新しい車は {{App.carController.color}} です。

ところで、ここに私が試したコードがありますが、上記の説明と同じ結果にはなりません。

/*----------
app.js
----------*/

var App = Ember.Application.create();

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

App.CarView = Ember.View.extend({
    color: 'blue',
    templateName: 'car'
});

App.CarController = Ember.Controller.extend();


App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        index: Ember.Route.extend({
            route: '/'
        })
    })
})

App.initialize();


/*----------
index.html
----------*/

<script type="text/x-handlebars" data-template-name="application">
    <h1>Hello from Ember.js</h1>
</script>

<script type="text/x-handlebars" data-template-name="car">
    My new car is {{color}}.<br />
    My new car is {{App.carController.color}}.
</script>

編集:

index.html

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

<!-- This Works -->  
{{#view App.CarView}}
    (1)My new car is {{view.color}}.<br />
{{/view}}

<!-- These don't Work -->
(2)My new car is {{view.color}}.<br />
(3)My new car is {{App.CarView.color}}.<br />

(4)My new car is {{App.CarController.color}}.<br />
(5)My new car is {{App.carController.color}}.<br />

<!-- this outlet-area shows what I have in my "car" template -->
{{outlet}}

</script>


<script type="text/x-handlebars" data-template-name="car">

<!-- This color property is defined in App.CarView.-->
(6)My new car is {{view.color}}.<br />

<!-- This color property is defined in App.CarCotroller.-->
(7)My new car is {{color}}.<br />

<!-- These don't work-->
(8)My new car is {{App.CarCotroller.color}}.<br />
(9)My new car is {{App.carCotroller.color}}.<br />

</script>

app.js

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


App.CarController = Ember.ObjectController.extend({ 
    color:'blue'
});

App.CarView = Ember.View.extend({   
    color:"blue",
    templateName: 'car'
});


App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        index: Ember.Route.extend({
            route: '/',
            connectOutlets:function(router){
                router.get('applicationController').connectOutlet('car');
            }     
        })
    })
})

App.initialize();

4

1 に答える 1

2

うーん、ドキュメントにエラーがあるようです。私はそれを見ていきます、それを指摘してくれてありがとう:)

通常、CarView テンプレートで {{color}} を使用すると、ビューのコンテキスト (デフォルトではコントローラー) が参照されます。色のプロパティはコントローラーで定義する必要があります。

ビューからプロパティを定義して参照する場合はview、テンプレートでキーワードを使用する必要があります。あなたの例では、 {{view.color}} が機能するはずです。

編集: ドキュメントに関しては、巨大な WIP があります: https://github.com/emberjs/website/tree/doc-refactorを参照してください。特に、ユースケースはもうありません: https://github.com/emberjs/website/blob/doc-refactor/source/guides/templates/handlebars-basics.md

更新: ここでの質問はすべて、次のすばらしい手順でカバーされていると思います: http://trek.github.com/

あなたの要点を理解するだけで十分だと思いますが、役に立つかもしれない短い答えを作ることができます.

1ここで {{view}} ヘルパーを使用して CarView を明示的に作成しているため、動作します。したがって、view.color の使用は有効です。

2 color プロパティを持たない ApplicationView のスコープ内にあるため、機能しません

3色は CarView クラスにない CarView インスタンスのプロパティであるため、機能しません

4 3 と同じ

5 Ember.js はコントローラーをインスタンス化しますが、それらはアプリのプロパティではなく、アプリケーションのルーターのプロパティです。したがって、 {{App.router.carController.color}} は機能します(ただし、使用しないでください、非常に悪い習慣です)

6 CarView のテンプレートにあり、色のプロパティが CarView クラスで定義されている (そして現在の CarView インスタンスでアクセスできる) ため、機能します。

7 CarController クラスで定義された color プロパティを参照するため機能します。前述したように、Ember.js はアプリケーションの初期化時にコントローラーをインスタンス化します。コードの後半で、router.get('applicationController').connectOutlet('car');Ember.js を呼び出すと、CarView クラスのインスタンスが作成され、それが router.carController インスタンスに接続され、ApplicationView のテンプレートの {{outlet}} に表示されます (connectOutlet() を呼び出しているため)。その結果、CarView テンプレートのレンダリング コンテキストは carController であるため、{{aProperty}} を使用する場合は を意味controller.aPropertyし、あなたの場合carController.colorは「青」です

8 3と同じ

9 5 と同じ

最後の質問については、私が言ったように、テンプレートから carController インスタンスに静的にアクセスしてはいけません :)

へー、それだけだと思います

于 2012-12-27T10:10:10.777 に答える