Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js当前用户-从控制器访问全局变量_Ember.js_Ember Data_Active Model Serializers - Fatal编程技术网

Ember.js当前用户-从控制器访问全局变量

Ember.js当前用户-从控制器访问全局变量,ember.js,ember-data,active-model-serializers,Ember.js,Ember Data,Active Model Serializers,我被一个看似简单的余烬问题难住了。我使用从rails控制器序列化rails当前用户方法,然后使用将当前用户元json提取并设置为全局ember变量 到目前为止一切都很好。现在,我可以通过键入App.metaData.current_user从控制台访问当前_用户信息,也可以通过调用特定属性从把手访问当前_用户信息,即: {{App.metaData.current_user.email}} 该电子邮件属性将显示在模板中。当我试图从ember控制器中访问该全局变量时,问题就出现了。这看起来非常简

我被一个看似简单的余烬问题难住了。我使用从rails控制器序列化rails当前用户方法,然后使用将当前用户元json提取并设置为全局ember变量

到目前为止一切都很好。现在,我可以通过键入App.metaData.current_user从控制台访问当前_用户信息,也可以通过调用特定属性从把手访问当前_用户信息,即:

{{App.metaData.current_user.email}}
该电子邮件属性将显示在模板中。当我试图从ember控制器中访问该全局变量时,问题就出现了。这看起来非常简单,但我似乎无法从任何ember控制器中访问当前用户。我试过:

currentUserBinding: 'App.metaData.current_user',

currentUser: function() {
  return App.metaData.current_user;
}.property(),

Ember.get('App.metaData.current_user')
和其他一些方法,但似乎无法访问它。奇怪的是,我可以通过控制台和把手直接访问当前用户,而不是从余烬控制器。我一定错过了什么明显的东西


非常感谢您的帮助

您可以定义一个变量来表示脚本标记中的用户id。这应该在服务器模板中完成:

<script type="text/javascript">
    window.user_id = 1;
</script>
然后,您可以使用
ApplicationController#userInfo
中的属性创建模板

<script type="text/x-handlebars">
    <h1>App</h1>
    {{userInfo.fullName}}
</script>

应用程序
{{userInfo.fullName}
如果需要从路由使用此数据,则可以使用;如果需要从其他控制器访问,则可以使用

(见附件)


请记住,这可能不是所有情况下的最佳解决方案,因为它会在应用程序初始化中添加一个请求,但现在对我来说,它确实起到了作用。

在我们的应用程序中,我们的做法与@MilkyWayJoe建议的相同,但我认为您的方法非常有趣。通过JSON传递当前用户是一种非常优雅的方法

我没有做过太多的实验,但从您的示例中可以看出,问题与序列化程序无关。computed属性有问题-您需要指定它依赖于
App.metaData.current\u user

App.ApplicationController = Ember.Controller.extend({
  currentUser: function() {
    return Ember.get('App.metaData.current_user')
  }.property('App.metaData.current_user')
});

这告诉ember,只要
App.metaData.currentUser
发生更改,它就应该重新计算currentUser属性。否则,它将运行一次fx(在ajax返回之前)并缓存响应。

在类似的场景中,我创建了一个
用户
模型,并将其设置为
应用程序控制器
的属性,因此,我可以通过路由中的
控制器访问,或通过控制器中的
需要访问。然后从服务器序列化一个用户对象,并在应用程序控制器上设置一个currentUser属性,该属性绑定到类似currentUser:App.user.find(0)的内容。是的,请参见下面的示例。我还添加了一个模拟的requests,将来我想找出一种方法,通过json传递当前用户,而不是将其嵌入服务器端模板中,但现在可以了!谢谢你,伙计!太棒了,谢谢你的帮助!现在我两种方法都起作用了。我试图避免在服务器端模板中嵌入javascript,但是这种方法有什么好处吗?我倾向于坚持JSON序列化,现在它可以与正确的计算属性一起工作。我认为两者都有优点/缺点。我们写了我们的应用程序之前,烬数据的元数据支持,所以没有考虑这一方法。嵌入服务器端的一个优点是,您不仅可以嵌入当前用户,还可以嵌入其他模型的数据,这可能比通过api获取JSON性能更好。
<script type="text/x-handlebars">
    <h1>App</h1>
    {{userInfo.fullName}}
</script>
App.ApplicationController = Ember.Controller.extend({
  currentUser: function() {
    return Ember.get('App.metaData.current_user')
  }.property('App.metaData.current_user')
});