我在项目中使用m.request,因为我有一个可能长时间运行的请求,所以我想用background:true
运行它。但是,似乎值永远不会设置为生成的m.prop
。
我根据此Stack Overflow answer制作了一个jsFiddle示例:http://jsfiddle.net/u5wuyokz/9/
我预计会发生的第二次调用应该在ctrl.test.data()
中有响应值,但它似乎仍然有undefined
。在代码中的Point A
处,它会记录正确的值。但是,在Point B
,它会记录false, undefined
,然后记录true, undefined
。
我不确定我做错了什么,或者这是否是预期的行为。
来自jsFiddle的代码:
var requestWithFeedback = function(args) {
var completed = m.prop(false)
var complete = function(value) {
completed(true)
return value
}
args.background = true
return {
data: m.request(args).then(complete, complete).then(function(value) {
//Point A
console.log(value);
m.redraw()
return value
}),
ready: completed
}
};
var mod = {
controller : function() {
this.test = requestWithFeedback({
method : "POST",
url : "/echo/json/",
serialize: serialize,
config: asFormUrlEncoded,
data : {
json : "{\"name\" : \"testing\"}"
}
});
},
view : function(ctrl) {
//Point B
console.log(ctrl.test.ready(), ctrl.test.data());
return m("div", ctrl.test.ready() ? 'loaded' : 'loading');
}
};
答案 0 :(得分:2)
编辑:问题是在分配数据之前调用了m.redraw
。相反,您可以为m.prop
创建data
,并在完成后让ajax请求分配该值。 requestWithFeedback
将如下所示:
var requestWithFeedback = function(args) {
var data = m.prop()
args.background = true
m.request(args).then(data).then(function() { m.redraw() })
return {
data: data,
ready: function() {return !!data()}
}
};
以下是使用此代码修改的小提琴版本:http://jsfiddle.net/u5wuyokz/11/
答案 1 :(得分:1)
使用background: true
时,Mithril的components branch或any other system执行同一个' tick'作为视图,控制器中的m.request
在各自视图调用时将无法解析。
因此,如果您使用initialValue
,则始终使用m.request
background: true
属性recommended。规范示例是,当您请求条目列表时,初始值为[]
:
var projectsModule = {
controller(){
this.projects = m.request( {
background : true,
initialValue : [],
url : '/projects.json'
} );
},
view( ctrl ){
return m( 'ul', ctrl.projects.map(
project => m( 'li', project.name )
) )
}
}
这解决了当他们期望能够以通用方式使用m.request
返回值时视图中断的实际问题,但是没有解决示例中更复杂的情况,其中{需要{1}}标记来表示加载'}州。我有一个通用API,它使用模型getter函数和一个可选的初始值。它具有ready
,next
,then
,hasResolved
,isPending
和get
方法:这使得视图在方式上更加灵活查询异步模型的状态。 set
表示该方法是否已解决,hasResolved
返回将使用当前请求解析的承诺,或者next
为假时解析下一个请求的承诺。