Ember.js 解决承诺之前,余烬选择组件渲染

Ember.js 解决承诺之前,余烬选择组件渲染,ember.js,ember-data,ember-cli,rsvp.js,Ember.js,Ember Data,Ember Cli,Rsvp.js,我有一个组件,它为标记添加了一些功能。我想在完全呈现后初始化一些javascript,包括所有标记。用于填充标记的数据是ajax请求提供的对象数组 我使用的是ember数据,并且发现当数据从存储中提供时,这种方法就起作用了,这意味着它是DS.RecordArray的一个实例,它有一些有用的属性,比如isLoaded。然而,当数据是从jqueryajax调用提供的,并且是纯JSON时,组件似乎试图在jQuery返回的承诺实现之前呈现所有内容 我觉得问题在于我是如何处理承诺的,因为这个问题似乎与在应

我有一个组件,它为
标记添加了一些功能。我想在
完全呈现后初始化一些javascript,包括所有
标记。用于填充
标记的数据是ajax请求提供的对象数组

我使用的是ember数据,并且发现当数据从存储中提供时,这种方法就起作用了,这意味着它是DS.RecordArray的一个实例,它有一些有用的属性,比如
isLoaded
。然而,当数据是从jqueryajax调用提供的,并且是纯JSON时,组件似乎试图在jQuery返回的承诺实现之前呈现所有内容

我觉得问题在于我是如何处理承诺的,因为这个问题似乎与在应该之前初始化的事情有关(即承诺已经正确解决)。我尝试在RSVP.Promise对象中包装ajax调用,但运气不好(我使用的是Ember CLI)。下面是我到目前为止所做的一个简化版本。任何帮助都将不胜感激

// My route
export default Ember.Route.extend({
    setupController: function(controller, model) {
        this._super(controller, model);

        var hash = Ember.RSVP.hash({
                // myOptions: $.getJSON('/api/options')
                myOptions: new Ember.RSVP.Promise(function(resolve, reject) {
                    Ember.$.ajax({
                        url: '/api/options',
                        type: 'get',
                        dataType: 'json',
                        success: function(result) {
                            Ember.run(null, resolve, result);
                        },
                        error: function(result) {
                            Ember.run(null, reject, result);
                        }
                    });
                })
            });

        return hash.then(function(result) {
            controller.set('optionsForSelect', result.myOptions);
        });
    }
});

// My component
export default Ember.Select.extend({
    didInsertElement: function() {
        // Is called before ajax request has finished
        this.$().mySelectPlugin({
        });
    }
});

// Handlebars template
{{my-select-plugin content=optionsForSelect optionValuPath="content.id" optionLabelPath="content.name"}}

对我来说,这似乎是应该在控制器中处理的事情,而不是路由。下面是我为类似情况所做的

App.LessonsShowIndexController = Ember.ObjectController.extend({
    author: function() {
        return this.get('model').get('author');
    }.property('author'),
    fullName: function() {
        return this.get('author').get('firstName') + ' ' + this.get('author').get('lastName');
    }.property('author.isFulfilled'),
});

使用IsCompleted属性允许控制器在使用数据之前等待承诺解析。在您的情况下,可以有一个属性返回一个承诺,另一个属性等待它实现。

setupController
返回承诺没有任何用处。尝试从
模型
(或
模型前
模型后
)返回承诺。是的,您是对的@torazaburo。谢谢你的帮助。