1

我在一个项目中使用 m.request,并且由于我有一个可能长时间运行的请求,我想用background:true. 但是,似乎该值永远不会设置为生成的m.prop.

我已经制作了一个 jsFiddle,其中包含一个基于此Stack Overflow 答案的示例: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');
        }
    };
4

2 回答 2

2

编辑:问题是m.redraw在分配数据之前调用。相反,您可以创建一个m.propfordata并让 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/

于 2015-02-07T13:49:37.447 回答
1

使用时background: true,Mithril 的组件分支或在与视图相同的“滴答”中执行控制器的任何其他系统m.request,在控制器中创建的s 将不会在它们被各自的视图调用时解析。

因此,如果您正在使用,建议始终使用. 典型示例是在您请求条目列表时具有初始值:initialValuem.requestbackground: true[]

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通用方式处理返回值时中断的实际问题,但没有解决您的示例中更复杂的情况,其中ready需要一个标志来指示“加载”状态。我有一个通用 API,它使用一个模型 getter 函数和一个可选的初始值。它有、 、 、 和next方法thenhasResolvedisPending允许视图在查询异步模型状态的方式上更加灵活。指示该方法是否曾经解析过,并返回一个将与当前请求一起解析的promise,或者如果为false,则在下一个请求解析时解析。getsethasResolvednextisPending

于 2015-03-02T17:40:07.053 回答