当我过渡到新路线时,我设置了reportName属性,并希望根据观察到的name更改postobject并触发发送ajax请求。在ajax的响应上,我获取了我想作为属性传递给图形组件的数据,并且此具有数据值的更新属性导致触发了组件中的函数。但即时通讯无法做到。你能告诉我我做错了吗?我是灰烬新手。
吊舱控制器:

export default Ember.Controller.extend(ApplicationRouteMixin, {
    sessionService: Ember.inject.service('session'),

    nameOfReport: null,

    postObject: function(){
        return {
            Name: this.get('nameOfReport'),
            Take: 30,
            Skip: 0,
        };
    }.property('nameOfReport'),


    ajaxResponse: function(){

       var restApiHost = serverPath + '/report';
       var postobj=  this.get('postObject');
       var token =this.get('sessionService.session.authenticated.access_token');

        Ember.$.ajax({
            url: restApiHost,
            type: 'POST',
            data: JSON.stringify(postobj),
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            beforeSend: function (xhr) {
                var bearer = 'Bearer ' + token ;
                xhr.setRequestHeader('Authorization', bearer);
                xhr.setRequestHeader('Content-type', 'application/json');
            },
            success: function (data) {
                var graphobj= {
                    data:  data.data,
                    graphModel: GraphModel.create({
                        graphHeight: "320",
                        graphMargin: [40, 80, 40, 60],
                        xDomain: [1, 10],
                        yDomain: [1, 100]
                    …
                    })};
                 Ember.set(this,'graphobject', graphobj);
            },

            fail: function () {
                alert('Could not contact server');
            },
        });
    }.property('postObject'),


    graphobject: function(){
        this.get('ajaxResponse');
    }.property('ajaxResponse'),

});


Pod模板:

<div>
               {{line-graph model= graphobject }}
</div>


零件:

drawGraph: function() {
        // define dimensions of graph
        var graphdata = this.get('model.data');
        var graphmodel = this.get('model.graphModel');
...
}.property('graphobject'),

最佳答案

首先,您的行Ember.set(this,'graphobject', graphobj);实际上会覆盖存储在graphobject属性中的函数-因此您不需要该函数。

其次,即使您的drawGraph属性由于其相关键之一已更改而被标记为脏(在您的代码中似乎是这种情况),它也不会运行,直到某些代码get对该属性起作用。如果模板本身访问属性,则可能是在重新渲染期间发生的;否则,可能是从观察者获得的,或者是在运行操作时发生了这种情况。

尝试使drawGraph遵守graphobject。此外,您可能需要在初始化或插入时运行drawGraph

drawGraph: function() {
    // define dimensions of graph
    var graphdata = this.get('model.data');
    var graphmodel = this.get('model.graphModel');
    ...
}.observes('graphobject').on('init')/* or .on('didInsertElement') */,


大多数人建议避免使用观察者,但是由于我不知道您在drawGraph函数中正在做什么,因此通常很难推荐其他东西。

如果要在drawGraph中设置属性,然后在模板中呈现该属性,则可以使drawGraph返回该值(而不是将其设置为其他属性),然后在模板中呈现drawGraph而不是其他财产。 (然后不要将drawGraph用作观察对象;将其保留为计算属性。)

如果您正在使用jQuery在drawGraph中操作DOM,并且由于某些原因无法使用模板进行操作,那么观察者可能是唯一的方法。

实际上,更多地看您的代码,我发现ajaxResponse也应该是观察者。但是,您还是想避免观察者,所以我要问自己,我何时应该发出AJAX请求并重新渲染图形?我认为答案不会在报告名称更改时出现。可能更像是用户单击“保存”或“查看”之类的按钮,在这种情况下,该按钮应在某处发送一个动作,然后该动作将触发AJAX调用,然后重新呈现图形。但是,这取决于您的应用程序。

关于javascript - 在Ember中触发组件中的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35902962/

10-12 07:06