当我过渡到新路线时,我设置了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/