Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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/9/extjs/3.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 我应该和如何在承诺回调中传递路径_Javascript_Ember.js_Callback_Promise_Ic Ajax - Fatal编程技术网

Javascript 我应该和如何在承诺回调中传递路径

Javascript 我应该和如何在承诺回调中传递路径,javascript,ember.js,callback,promise,ic-ajax,Javascript,Ember.js,Callback,Promise,Ic Ajax,在一个Ember控制器中,我想调用我的API来创建一个用户,并在成功后,调用TransitionRoute。这就是我目前想要的工作: import ajax from "ic-ajax"; import Ember from "ember"; export default Ember.Controller.extend({ actions: { createAndLoginUser: function() { var user = { "user": this.ge

在一个Ember控制器中,我想调用我的API来创建一个用户,并在成功后,调用TransitionRoute。这就是我目前想要的工作:

import ajax from "ic-ajax";
import Ember from "ember";

export default Ember.Controller.extend({
  actions: {  
    createAndLoginUser: function() {
      var user = { "user": this.getProperties("email", "name") };
      ajax({ url: "api/users", type: "POST", data: user })
        .then(transitionToHome);
    }   
  }
});

var transitionToHome = function() {
  this.transitionToRoute("home")
}
但是当我在方法中放置
调试器时,
这个
不再是控制器对象,并且超出了调用
TransitionRoute
的范围


我只写过黑客javascript,但我正在努力学习核心概念和一些框架。这是使用承诺的正确方式吗?这是在灰烬中放置过渡的正确位置吗?

您的问题与灰烬或过渡无关;这一切都与处理有关。最简单的解决办法就是

.then(transitionToHome.bind(this));
将转换方法放入控制器中

您也可以考虑将<>代码>转换为“家庭< /代码>”作为一种方法。然后,您可以如下所示调用它:

export default Ember.Controller.extend({

  transitionToHome: function() { this.transitionToRoute("home"); },

  actions: {  
    createAndLoginUser: function() {
      var self = this;
      var user = { "user": this.getProperties("email", "name") };
      ajax({ url: "api/users", type: "POST", data: user })
        .then(function() { self.transitionToHome(); });
    }   
  }

});
这可能是一种更简单的方法,更具可读性,不需要对
这一
进行推理,也不需要使用
绑定
(但需要使用
自我

将过渡移动到路线? 在您的问题范围之外,但是有些人会说路由相关逻辑(包括转换)在逻辑上属于路由,而不是控制器。如果您同意,您可以重构上述内容以执行
send

createAndLoginUser: function() {
  var user = { "user": this.getProperties("email", "name") };
  var self = this;
  ajax({ url: "api/users", type: "POST", data: user })
    .then(function() { self.send("goHome"); });
  }
}
然后在路线中执行
goHome
操作。或者,您可以在更高级别的路由(甚至是应用程序路由)中实现
goHome
,从而使其可从任何控制器或更低级别的路由使用

将AJAX逻辑移动到服务? 其他人可能会说ajax逻辑并不真正属于控制器,应该是服务层,所以

// services/user.js
export function createUser(data) {
  return ajax({ url: "api/users", type: "POST", data: { user: data } });
}

// controller
import { createUser } from 'app/services/user';

export default Ember.Controller.extend({
  createAndLoginUser: function() {
    var data = this.getProperties("email", "name"));
    var self = this;
    createUser(data) . then(function() { self.send("goHome"); });
  }
};
使用ES6语法,我们可以避免使用
self
,从而简化过程:

  createAndLoginUser: function() {
    var data   = this.getProperties("email", "name"));
    var goHome = () => this.send("goHome");

    createUser(data) . then(goHome);
  }

现在,这段代码看起来更具语义和可读性。

您的问题与余烬或转换无关;这一切都与处理有关。最简单的解决办法就是

.then(transitionToHome.bind(this));
将转换方法放入控制器中

您也可以考虑将<>代码>转换为“家庭< /代码>”作为一种方法。然后,您可以如下所示调用它:

export default Ember.Controller.extend({

  transitionToHome: function() { this.transitionToRoute("home"); },

  actions: {  
    createAndLoginUser: function() {
      var self = this;
      var user = { "user": this.getProperties("email", "name") };
      ajax({ url: "api/users", type: "POST", data: user })
        .then(function() { self.transitionToHome(); });
    }   
  }

});
这可能是一种更简单的方法,更具可读性,不需要对
这一
进行推理,也不需要使用
绑定
(但需要使用
自我

将过渡移动到路线? 在您的问题范围之外,但是有些人会说路由相关逻辑(包括转换)在逻辑上属于路由,而不是控制器。如果您同意,您可以重构上述内容以执行
send

createAndLoginUser: function() {
  var user = { "user": this.getProperties("email", "name") };
  var self = this;
  ajax({ url: "api/users", type: "POST", data: user })
    .then(function() { self.send("goHome"); });
  }
}
然后在路线中执行
goHome
操作。或者,您可以在更高级别的路由(甚至是应用程序路由)中实现
goHome
,从而使其可从任何控制器或更低级别的路由使用

将AJAX逻辑移动到服务? 其他人可能会说ajax逻辑并不真正属于控制器,应该是服务层,所以

// services/user.js
export function createUser(data) {
  return ajax({ url: "api/users", type: "POST", data: { user: data } });
}

// controller
import { createUser } from 'app/services/user';

export default Ember.Controller.extend({
  createAndLoginUser: function() {
    var data = this.getProperties("email", "name"));
    var self = this;
    createUser(data) . then(function() { self.send("goHome"); });
  }
};
使用ES6语法,我们可以避免使用
self
,从而简化过程:

  createAndLoginUser: function() {
    var data   = this.getProperties("email", "name"));
    var goHome = () => this.send("goHome");

    createUser(data) . then(goHome);
  }

现在这段代码看起来更具语义和可读性。

另一种解决方案是简单地使用ES6箭头语法来维护这段代码的上下文:

import ajax from "ic-ajax";
import Ember from "ember";

export default Ember.Controller.extend({
  actions: {  
    createAndLoginUser() {
      let user = { "user": this.getProperties("email", "name") };
      ajax({ url: "api/users", type: "POST", data: user })
        .then(() => {
          this.transitionToRoute("home");
        });
    }   
  }
});

另一种解决方案是简单地使用ES6箭头语法来维护此
的上下文:

import ajax from "ic-ajax";
import Ember from "ember";

export default Ember.Controller.extend({
  actions: {  
    createAndLoginUser() {
      let user = { "user": this.getProperties("email", "name") };
      ajax({ url: "api/users", type: "POST", data: user })
        .then(() => {
          this.transitionToRoute("home");
        });
    }   
  }
});

或者,当我尝试将其添加为控制器方法时,我收到相同的
无法读取未定义的
transitionhome:function(){this.transitionToRoute(“home”)}的属性'transitionhome',
EDIT:刚刚添加了我的控制器方法代码。很抱歉,此/自身问题现已修复。也感谢所有反馈!我肯定会尝试这些重构,我一直在努力使用Ember文档。让这些重构工作起来,代码看起来很棒!我在制作它们时遇到了两件事:1)
createUser
import必须是
。/services/user
?2)
createUser
方法是导入的类
user
的一部分?除此之外,再次感谢!谢谢你的跟进。可以使用相对路径或绝对路径进行导入。前者是来自“../services/user”
,后者是来自“*appname*/services/user”
,用应用程序的实际名称替换
appname
,并假设
服务
位于树的顶部。在这种情况下,我更喜欢后者。请注意第二点,我的错误,导入应该是
import{createUser}from
..`。或者,当我尝试将其添加为控制器方法时,我收到相同的
无法读取未定义的
TransitionHome:function()的属性“TransitionHome”{this.transitionToRoute(“home”),
EDIT:刚刚添加了我的控制器方法代码。很抱歉,此/自我问题现已修复。也感谢所有反馈!我肯定会尝试这些重构,我一直在努力使用Ember文档。让这些重构工作起来,代码看起来很棒!我在制作它们时遇到了两件事:1)
createUser
import必须是
。/services/user
?2)
createUser
方法是导入的类
user
的一部分?除此之外,再次感谢!谢谢你的跟进。可以使用相对路径或绝对路径进行导入。前者是来自“../services/user”
,后者是来自“*appname*/services/user”
,用应用程序的实际名称替换
appname
,并假设
服务
位于树的顶部。在这种情况下,我更喜欢后者。请注意第二点,我的错误,导入应该是
import{createUser}from
。。