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