Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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
Javascript 如何在Ember中刷新控制器属性?_Javascript_Session_Ember.js - Fatal编程技术网

Javascript 如何在Ember中刷新控制器属性?

Javascript 如何在Ember中刷新控制器属性?,javascript,session,ember.js,Javascript,Session,Ember.js,在过去的两天里,我一直在努力解决这个问题。我找不到在Ember中刷新控制器属性的方法-换句话说,除了缓存旧值之外,让handlebars模板再次查找控制器属性。这个问题与会话存储有关。代码如下: <script type="text/x-handlebars" id="start"> {{log isLoggedIn}} {{#if isLoggedIn}} <p>Welcome, <strong>{{controllers.a

在过去的两天里,我一直在努力解决这个问题。我找不到在Ember中刷新控制器属性的方法-换句话说,除了缓存旧值之外,让handlebars模板再次查找控制器属性。这个问题与会话存储有关。代码如下:

<script type="text/x-handlebars" id="start">
    {{log isLoggedIn}}
    {{#if isLoggedIn}}
        <p>Welcome, <strong>{{controllers.application.name}}</strong>!<br/>
           Your user role is: <strong>{{controllers.application.role}}</strong></p>
    {{else}}
        <p>Unfortunately, you're not logged in so you cannot access this content.</p>
    {{/if}}
</script>
我已经尽力了。我在chrome开发者控制台中看到会话设置正确。然而,当我导航到
开始
页面时,我收到了“不幸”的消息。我的控制台日志显示会话为false

如果我尝试这样做:

App.ApplicationController = Ember.ObjectController.extend({
    hasSession: function() {
        return getLoggedIn();
    }
});

function getLoggedIn() {
    var session = window.sessionStorage.getItem("session");
    if (session) {
        return session.length === 16;
    }
    return false;
}
我仍然有同样(或者更类似)的问题-导航到
开始
页面仍然会显示消息,就好像用户没有登录一样,即使sessionStorage包含了所有内容。但是当我手动刷新页面时,它会给我正确的“欢迎”信息


我怎样才能解决这个问题?基本上,我需要控制器“理解”会话已更改,并意识到用户已登录-或者,换句话说,我需要刷新控制器的属性(无需重新加载页面)。

Ember没有任何用于查看会话存储的内置功能,但这里确实不需要它。您可以在解析的ajax调用中完成(类似于这样)

计算属性 默认情况下,Ember的计算属性被缓存,并被延迟加载。这意味着重新计算属性的唯一方法是更改某个从属属性。在下面的示例中,如果您要更改条,foo将被标记为dirty,然后被重新计算(如果有人监视)

在这个例子中,它也只会得到重新计算,如果酒吧改变。不幸的是,如果baz改变了,foo就不会被重新计算

bar:'asdf',
baz:'fdas',
foo: function(){
  return this.get('bar') + this.get('baz');
}.property('bar')
易失性计算属性 每次请求时都将重新计算易失性计算属性

bar:1,
foo: function(){
   this.incrementProperty('bar');
   return this.get('bar');
}.property().volatile(),

blah: function(){
  this.get('foo');
  this.get('foo');
  this.get('foo');
}

示例:

余烬没有任何用于查看会话存储的内置功能,但这里确实不需要它。您可以在解析的ajax调用中完成(类似于这样)

计算属性 默认情况下,Ember的计算属性被缓存,并被延迟加载。这意味着重新计算属性的唯一方法是更改某个从属属性。在下面的示例中,如果您要更改条,foo将被标记为dirty,然后被重新计算(如果有人监视)

在这个例子中,它也只会得到重新计算,如果酒吧改变。不幸的是,如果baz改变了,foo就不会被重新计算

bar:'asdf',
baz:'fdas',
foo: function(){
  return this.get('bar') + this.get('baz');
}.property('bar')
易失性计算属性 每次请求时都将重新计算易失性计算属性

bar:1,
foo: function(){
   this.incrementProperty('bar');
   return this.get('bar');
}.property().volatile(),

blah: function(){
  this.get('foo');
  this.get('foo');
  this.get('foo');
}

示例:

尝试使用观察者代替计算属性。尝试使用观察者代替计算属性。非常感谢。在您编写答案的同时,我还能够让代码正常工作,我们最终也做了同样的事情(唯一的区别是我在我的ajax
.done()
call中调用了
self.set
)。但我有一个问题,与会话存储无关-是否有方法刷新控制器属性?是的,我将给您一个volatile vs cached等的示例。“等腰三角形任意两条边的平方根之和等于剩余边的平方根!”非常感谢!我完全忘记了volatile()。我觉得《灰烬指南》需要真正更新,至少要提到控制器等提供的所有东西。他们的API文档看起来不错。我想看看
volatile
是首选的情况。。。我一直认为计算属性是很好的获取工具,而通过调用它来设置值的想法似乎很难闻。也就是说,我喜欢它在工具包中。property()。volatile()太棒了。。经过两天的努力解决了我的问题。。非常感谢你,非常感谢你。在您编写答案的同时,我还能够让代码正常工作,我们最终也做了同样的事情(唯一的区别是我在我的ajax
.done()
call中调用了
self.set
)。但我有一个问题,与会话存储无关-是否有方法刷新控制器属性?是的,我将给您一个volatile vs cached等的示例。“等腰三角形任意两条边的平方根之和等于剩余边的平方根!”非常感谢!我完全忘记了volatile()。我觉得《灰烬指南》需要真正更新,至少要提到控制器等提供的所有东西。他们的API文档看起来不错。我想看看
volatile
是首选的情况。。。我一直认为计算属性是很好的获取工具,而通过调用它来设置值的想法似乎很难闻。也就是说,我喜欢它在工具包中。property()。volatile()太棒了。。经过两天的努力解决了我的问题。。非常感谢你。。
bar:1,
foo: function(){
   this.incrementProperty('bar');
   return this.get('bar');
}.property().volatile(),

blah: function(){
  this.get('foo');
  this.get('foo');
  this.get('foo');
}