财产上的Ajax承诺没有返回数据

时间:2017-04-17 02:19:52

标签: javascript ember.js rsvp-promise

我有一个带有简单属性的Ember控制器,它应该从服务器获取文件列表。服务器端都很好,数据正在返回并显示在控制台上。

在控制器中我有:

imgFiles: new Ember.RSVP.Promise(function(resolve, reject) {
                Ember.$.ajax(ENV.apiHost+'/'+ENV.apiNamespace +'/folderwalk/newsimg', {
                    success: function(response) {
                        // console.log(response);
                        resolve(response);

                    },
                    error: function(reason) {
                        reject(reason);

                    }
                });
            }),

在模板中:

{{imgFiles}}  // shows [object Object]
{{#each imgFiles as |file|}}   // doesn't loop at all
        x {{file}}
{{/each}}

我已经尝试过我能想到的所有变化。封装功能并返回Promise,返回成功响应,...
我仍然无法回复实际数据。

2 个答案:

答案 0 :(得分:1)

是的,当您记录响应时,您将获得整个有效负载。但是,Ember并不知道从服务器返回的新数据(以前它将是Promise)。您必须使用set明确告知Ember有关新数据的信息。

  imgList: Ember.computed({
    get() {
      return new Ember.RSVP.Promise((resolve, reject) => {

        $.ajax('https://jsonplaceholder.typicode.com/photos').then((data, textStatus, jqXHR) => {
          console.log(data);
          let firstHunPhotos = data.slice(0,100);
          this.set('imgList', firstHunPhotos); // <- set the new data | set the entire data if you want!
        });
      });
    },
    set(key, value) {
        return value // <- don't forget the setter!
    }
  })

请参考这个旋风。 https://ember-twiddle.com/25d11c4c4650c18183df3595ca21f9c3?numColumns=2&openFiles=templates.application.hbs%2Ccontrollers.application.js

答案 1 :(得分:0)

通常这些来自模特。渲染将延迟,直到模型得到解决。

您的案例可以采用不同的方式实施。获取有关mount / init事件的详细信息,并将已解析的值设置为属性,并将该属性与视图绑定。一旦值更新,将重新呈现视图