Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 Ember了解路由/控制器之间的执行流程_Javascript_Ajax_Ember.js_Ember Cli_Rsvp Promise - Fatal编程技术网

Javascript Ember了解路由/控制器之间的执行流程

Javascript Ember了解路由/控制器之间的执行流程,javascript,ajax,ember.js,ember-cli,rsvp-promise,Javascript,Ajax,Ember.js,Ember Cli,Rsvp Promise,我有一个盒子路径/控制器,如下所示 export default Ember.Controller.extend({ initialized: false, type: 'P', status: 'done', layouts: null, toggleFltr: null, gridVals: Ember.computed.alias('model.gridParas'), gridParas: Ember.computed('mySer

我有一个盒子路径/控制器,如下所示

export default Ember.Controller.extend({
    initialized: false,
    type: 'P',
    status: 'done',
    layouts: null,
    toggleFltr: null,
    gridVals: Ember.computed.alias('model.gridParas'),
    gridParas: Ember.computed('myServerPars', function() {
        this.set('gridVals.serverParas', this.get('myServerPars'));
        this.filterCols();

        if (!this.get('initialized')) {
            this.toggleProperty('initialized');
        } else {
            Ember.run.scheduleOnce('afterRender', this, this.refreshBox);
        }

        return this.get('gridVals');
    }),
    filterCols: function()
    {
        this.set('gridVals.layout', this.get('layouts')[this.get('type')]);
    },
    myServerPars: function() {
        // Code to set serverParas
        return serverParas;
    }.property('type', 'status', 'toggleFltr'),
    refreshBox: function(){
        // Code to trigger refresh grid
    }
});
我的路线看起来像

export default Ember.Route.extend({
    selectedRows: '',
    selectedCount: 0,
    rawResponse: {},
    model: function() {
        var compObj = {};
        compObj.gridParas = this.get('gridParas');
        return compObj;
    },
    activate: function() {
        var self = this;
        self.layouts = {};

        var someData = {attr1:"I"};
        var promise = this.doPost(someData, '/myService1', false); // Sync request (Is there some way I can make this work using "async")
        promise.then(function(response) {       
            // Code to use response & set self.layouts
            self.controllerFor(self.routeName).set('layouts', self.layouts);
        });
    },
    gridParas: function() {
        var self = this;
        var returnObj = {};
        returnObj.url = '/myService2';
        returnObj.beforeLoadComplete = function(records) {          
            // Code to use response & set records
            return records;
        };
        return returnObj;
    }.property(),   
    actions: {      
    }
});
我的模板看起来像

{{my-grid params=this.gridParas elementId='myGrid'}}
我的doPost方法如下所示

doPost: function(postData, requestUrl, isAsync){
    requestUrl = this.getURL(requestUrl);
    isAsync = (isAsync == undefined) ? true : isAsync;
    var promise = new Ember.RSVP.Promise(function(resolve, reject) {
        return $.ajax({
            // settings
        }).success(resolve).error(reject);

    });
    return promise;
  }
鉴于上述设置,我想了解执行的流程/顺序,即不同挂钩的流程/顺序。 我试着调试,它不断地从一个类跳到另一个类。 还有2个具体问题

我原本希望启动激活钩子,但发现情况并非如此。它首先执行gridhook i、 e.在激活挂钩之前。是不是因为我 在模板中指定

当我为/myService1执行这个.doPost时,它必须是一个同步请求,否则执行流会改变,我会得到一个错误。 事实上,我想在filterCols控制器中输入代码,即。 this.set'gridVals.layout',this.get'layouts'[this.get'type']设置为 仅在收到来自的响应后执行 /我的服务1。但是,到目前为止,我必须使用同步请求来完成 否则,使用async时,执行将移动到filterCols和 因为我还没有响应,所以它抛出了一个错误

只是补充一下,我使用的是Ember v 2.0

路线上的激活在beforeModel、model和afterModel挂钩后触发。。。因为这3个钩子被认为是验证阶段,它决定了路由是否会被解析。要明确的是,这个路由钩子与在模板中使用gridParas无关。。。它与在模型钩子中调用get'gridParas'有关。 我不清楚doPost在哪里连接到您的其余代码。。。但是,因为它返回一个promise对象,所以您可以加上一个then,这将允许您基本上等待promise响应,然后在代码的其余部分使用它。 简单的例子:

this.doPost().then((theResponse) => {
  this.doSomethingWith(theResponse);
});

如果你能简化你的问题,使之更加清晰和简洁,我也许能提供更多的信息。一般来说,在这个级别上,你应该解释你想要归档的内容,而不仅仅是问它是如何工作的,因为我认为你在与框架作斗争

但我从你的评论中删除了这一点

首先,您不需要doPost方法!jQuerys$.ajax返回一个thenable,可以使用Ember.RSVP.resolve将其解析为承诺

下一步:如果您想在实际渲染任何内容之前获取数据,您应该在模型挂钩中执行此操作

我不确定是否要获取/service1,然后通过响应生成对/service2的请求,或者是否可以独立获取这两个服务,然后将数据显示在网格中?使用这两种服务的数据。所以这里有两种方法:

如果可以独立获取这两个服务,请在路由模型挂钩中执行此操作:

return Ember.RSVP.resolve($.ajax(/*/service1*/)).then(service1 => {
  return Ember.RSVP.resolve($.ajax(/*/service2*/)).then(service2 => {
    return {
      service1,
      service2
    }; // this object will then be available as `model` on your controller
  });
});
如果需要/service1的响应来获取/service2,只需在模型挂钩中执行以下操作:

return Ember.RSVP.resolve($.ajax(/*/service1*/)).then(service1 => {
  return Ember.RSVP.resolve($.ajax(/*/service2*/)).then(service2 => {
    return {
      service1,
      service2
    }; // this object will then be available as `model` on your controller
  });
});

如果这对您没有帮助,我真的认为这应该可以解决您的问题,请描述您的问题。

Thx对于响应…对于doPost部分…基本上有两个AJAX调用。第一个调用是包装在我的自定义承诺实现方法中的/myService1,第二个调用是由我的自定义承诺实现方法生成的/myService2组件当我说returnObj.url='/myService2'时,我希望它们按以下顺序工作;1.致电/myservice12。然后在收到1的响应后,调用/myService2 3。然后控件应转到控制器,网格应填充,即以下要执行的代码…this.set'gridVals.layout',this.get'layouts'[this.get'type'];