我有一个简单的应用程序,您可以登录它,如下所示:
{{#view App.mainV}}
{{#if logged}}
Hey!
{{else}}
<!-- Login form here when clicked: App.mainC.login()-->
{{/if}}
{{/view}}
以下是样本控制器:
App.mainC = Ember.ArrayController.create({
login: function(){
if(ok)//Everything went fine
App.mainV.logged = true;
}
});
这是mainV:
App.mainV = Ember.View.extend({
logged: false,
test: function()
{
console.log('JO');
}
});
我对此应用有两个问题:
如果我调用App.mainV.test(),我会收到错误消息。为什么呢?
TypeError:'App.mainV.test'不是函数
答案 0 :(得分:7)
如果要从模板访问视图的属性,则必须以“view”作为前缀。在您的示例中:{{#if view.logged}}
。
您不能App.mainV.test()
,因为App.mainV
是一个类,而不是一个实例。你可以做App.mainV.create().test()
。
您应该将App.mainV
重命名为App.MainV
以符合Ember.js惯例(类名应大写,请参阅http://www.emberist.com/2012/04/09/naming-conventions.html)
修改强>:
您的示例中还有另一个问题:控制器尝试修改视图中的值。在Ember方式中,您应该将视图的属性绑定到控制器。控制器中的任何更改都将传播到视图:
<script type="text/x-handlebars">
{{#view App.MainView}}
{{#if view.logged}}
Hey!
{{else}}
<!-- Login form here when clicked: App.mainController.login()-->
{{/if}}
{{/view}}
</script>
App = Ember.Application.create();
App.mainController = Ember.Controller.create({
logged: false,
login: function() {
this.set('logged', true);
}
});
App.MainView = Ember.View.extend({
loggedBinding: 'App.mainController.logged'
});
// change in controller will be propagated to the view
App.mainController.set('logged', true);