Javascript 我应该和如何在承诺回调中传递路径
在一个Ember控制器中,我想调用我的API来创建一个用户,并在成功后,调用TransitionRoute。这就是我目前想要的工作: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
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
。。