Javascript 解析后承诺值未放入模板
我对javascript和承诺相当陌生,所以我可能不了解所有的基本概念,但我正在尝试 我的模型中有一个函数用于检查Friendstatus:Javascript 解析后承诺值未放入模板,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,我对javascript和承诺相当陌生,所以我可能不了解所有的基本概念,但我正在尝试 我的模型中有一个函数用于检查Friendstatus: friendShipStatus: function() { var self = this; return Ember.RSVP.all([this.container.lookup('user:current'), this.get
friendShipStatus: function() {
var self = this;
return Ember.RSVP.all([this.container.lookup('user:current'),
this.get('myFriends'),
this.get('friendsWithMe'),
this.get('friends')]).then(function(result){
var user = result[0], myFriends = result[1],
friendsWithMe = result[2], friends = result[3]
if(friends.contains(user)){
return 2;
} else if(friendsWithMe.contains(user)){
return 4;
} else if(myFriends.contains(user)){
return 1;
} else if (self.get('id') === user.get('id')){
return 3;
} else {
return 0;
}
});
}.property('friends')
不,我只想通过以下方式在我的tmeplate中输出此值(例如3):
FriendStatus :{{ friendShipStatus}}<br>
FriendStatus:{{FriendStatus}}
但我只得到对象输出:
FriendStatus:[对象]
如果我通过log助手{{log friendShipStatus}
记录输出,我会看到承诺被解析为值3。为什么这个值不放在我的模板中?下面有一种更高级的方法,但这种方法也很有效。
您需要使用观察者,然后为结果设置另一个属性。产生承诺的计算属性应该用作承诺(如果其他对象希望等待该值可用)
设置计算属性的值是一种反模式,计算属性应该是一个计算自身并返回结果的属性。如果设置它,您将清除计算属性,并说此属性的值为x
。这将破坏computed属性,之后它将不再更新
在您的情况下,可能是这样的:
friendShipStatus: '',
friendShipStatusObserver: function() {
var self = this;
Ember.RSVP.all([this.container.lookup('user:current'),
this.get('myFriends'),
this.get('friendsWithMe'),
this.get('friends')]).then(function(result){
var user = result[0], myFriends = result[1],
friendsWithMe = result[2], friends = result[3]
if(friends.contains(user)){
self.set('friendShipStatus', 2);
} else if(friendsWithMe.contains(user)){
self.set('friendShipStatus', 4);
} else if(myFriends.contains(user)){
self.set('friendShipStatus', 1);
} else if (self.get('id') === user.get('id')){
self.set('friendShipStatus', 3);
} else {
self.set('friendShipStatus', 0);
}
});
}.observes('friends')
更先进的方法
您还可以构建promise代理对象,该对象在您的情况下可能更容易工作。实际上,您构建了一个ObjectProxy
(这与ObjectController
用于将属性从模型代理到模板的方法相同)。但您添加了一个扭曲,您使用了PromiseProxyMixin
,这将允许您从承诺的解析中代理值。您不能只使用结果{{goodComputed}},这只会打印出promise代理。因此,您需要将解析的值包装在某种类型的对象中,resolve({value:change})
。一旦进入一个对象,您就可以在模板中使用{{goodComputed.value}
,因为ObjectProxy
上不存在值,所以它将向下代理承诺。我在下面举了一个例子
goodComputed: function(){
var self = this,
change = this.get('yourInput'),
promise,
result;
promise = new Ember.RSVP.Promise(function(resolve){
Em.run.later(function(){
resolve({value:change});
}, 200);
});
result = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin).create({
promise: promise
});
return result;
}.property('yourInput'),
如果-不返回RSVP all,而是设置一个字符串值(在RSVP调用上方初始化),在函数底部,您只需返回空字符串,并让数据绑定魔法在回调过程中更改它?尝试将
return 3
替换为self.set('Friendstatus',3)
我现在用self.set完成了。。。。。发布一个我可以接受的答案你肯定不想这么做…我已经尝试过你的版本,但是有一些问题。我尝试了您在下面描述的版本,但我的友谊状态保持为“”。我与您的其他示例进行了比较,并添加了on('init)函数。但是在Init上,即使在没有访问函数的页面上,函数也会被多次触发,在函数的15个调用中,有一个调用“user”是未定义的,这会导致错误。我绝对不建议使用这样的容器。如果你这样做了,你可以先检查它是否为空,如果是的话就退出这个方法。我还更新了一个更高级的方法,它可能更适合你的需要(时间方面)
goodComputed: function(){
var self = this,
change = this.get('yourInput'),
promise,
result;
promise = new Ember.RSVP.Promise(function(resolve){
Em.run.later(function(){
resolve({value:change});
}, 200);
});
result = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin).create({
promise: promise
});
return result;
}.property('yourInput'),