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
Javascript 解析后承诺值未放入模板_Javascript_Ember.js_Handlebars.js - Fatal编程技术网

Javascript 解析后承诺值未放入模板

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

我对javascript和承诺相当陌生,所以我可能不了解所有的基本概念,但我正在尝试

我的模型中有一个函数用于检查Friendstatus:

 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'),