<更新>
针对问题中的更新:
{{#view App.SomeView}} ... {{/view}}
如果该视图没有与之关联的任何模板,则应使用该视图。另一方面,{{view App.SomeView}}
如果已通过命名约定或templateName
属性为此视图创建了模板,则应使用该模板。例子:
{{view Ember.TextField valueBinding="view.userName"}}
</更新>
当您{{view.propertyName}}
在 Handlebars 模板中看到时,这意味着您正在使用/呈现您所在视图中的属性,因此您最初的假设是正确的。例如:
App = Em.Application.create();
App.HelloView = Em.View.extend({
welcome: 'Willkommen',
userName: 'DHH',
greeting: function() {
return this.get('welcome') + ' ' + this.get('userName');
}.property('welcome', 'userName')
});
然后在您的应用程序模板中:
<script type="text/handlebars">
<h1>App</h1>
{{#view App.HelloView}}
{{view.greeting}}
{{/view}}
</script>
在这种情况下,该{{view.greeting}}
部件将在 View ( HelloView
) 的范围内查找名为的属性greeting
(对于任何这些属性都是相同的),而不是在父视图中(ApplicationView
这是隐含的)。您必须{{view.propertyName}}
在调用视图中定义的属性时使用。控制器中定义的属性可以直接访问,无需前缀。
原因之一是确保您调用了正确的属性。考虑以下:
App = Em.Application.create();
App.ApplicationView = Em.View.extend({
userName: 'David'
});
App.HelloView = Em.View.extend({
welcome: 'Willkommen',
userName: 'DHH',
greeting: function() {
return this.get('welcome') + ' ' + this.get('userName');
}.property('welcome', 'userName')
});
现在,应用程序视图和内部视图都定义了一个属性,命名userName
为表示略有不同的事物。为了区分哪个是哪个,您可以使用view
andparentView
关键字来访问属性:
<script type="text/handlebars">
<h1>App</h1>
<!-- this comes from the ApplicationView -->
<h3>{{view.userName}}'s Profile</h3>
{{#view App.HelloView}}
<!-- this comes from the HelloView -->
{{view.welcome}} {{view.userName}}
{{/view}}
</script>
如果你想/需要在这个例子中使用真实姓名和昵称,你必须:
<script type="text/handlebars">
<h1>App</h1>
{{#view App.HelloView}}
<!-- this comes from the ApplicationView -->
<h3>{{parentView.userName}}'s Profile</h3>
<!-- this comes from the HelloView -->
{{view.welcome}} {{view.userName}}
{{/view}}
</script>
相关参考: