秘银组件 - 有界控制器

时间:2016-09-19 00:20:13

标签: javascript mithril.js

我有一个带有控制器的秘银组件,该控制器已经绑定到上下文,如果我使用m.component(),则mithril忽略有界控制器并为视图提供默认的空控制器

    @Override
    public void onDraw(Canvas canvas) {        
        super.onDraw(canvas);

        Paint stroke = new Paint();
        stroke.setColor(Color.BLACK);
        stroke.setStyle(Paint.Style.STROKE);
        stroke.setStrokeWidth(5);
        stroke.setAntiAlias(true); 

        canvas.drawLine(0f,0f,1440f,2464f,stroke);
    }

但是,如果我通过m.module传递视图/控制器,一切都按预期工作

UserWidget = function(){
  this.allUsers =  User.load();
  this['header'] = {      
    'controller' : function(users){
      this.users = users;
    }.bind(this, this.allUsers),
    'view' : function(ctrl) {
      console.log('ctrl', ctrl)
      if (ctrl.users()) {
        return m('.user', ctrl.users()[0].name());
      }
    }
  }
}

//initialize
m.module(document.body, m(new UserWidget().header));

https://jsfiddle.net/chifer/mwddffy4/2/

组件控制器应该是无限制的,并通过m.component调用传递params,这是一个警告吗?或者这是一个错误?

1 个答案:

答案 0 :(得分:1)

  

组件控制器应该是无限制的,并通过m.component调用传递params,这是一个警告吗?

是。控制器被调用为具有let subPart: Dictionary = ["path":sourcePath] do { let data = try JSONSerialization.data(withJSONObject: subPart, options: []) let dataString = String(data: data, encoding: .utf8) headers = ["Authorization": "Bearer " + token2Save, "Dropbox-API-Arg": dataString!] } catch { print("crunch") } Alamofire.request("https://content.dropboxapi.com/2/files/download", method: .post, encoding: JSONEncoding.init(options: []), headers: headers).responseData(completionHandler: {feedback in guard feedback.result.value != nil else { print("Error: did not receive data", print("request \(request) feedback \(feedback)")) return } guard feedback.result.error == nil else { print("error calling POST on list_folder") print(feedback.result.error) return } if let JSON = feedback.result.value { print("JSON: \(JSON)") let dataString = String(data: JSON, encoding: .utf8) print("JSON: \(JSON) \(dataString)") } if let IMAGE = feedback.result.value { sharedDataAccess.fnData(index2seek: 0, fnData: feedback.result.value! as Data) NotificationCenter.default.post(name: Notification.Name("previewPane"), object: nil, userInfo: nil) } }) 关键字的构造函数,这意味着new(和传入的参数)不能绑定到它。

您可以通过避免this和内部绑定来简化您的代码:

this

Fiddle here

但实际上,这段代码正在复制已经内置到控制器中的功能 - 引用the Mithril API documentation for components

  

可选控制器功能创建一个可以按以下推荐方式使用的对象:

     

[...]

     
      
  • 它可以存储从模型方法返回的上下文数据(即来自promiserequest)。
  •   
  • 它可以保存对视图模型的引用。
  •   

基本上,您的原始应用程序代码涉及一个构造函数,该构造函数发出请求并存储对返回的promise的引用,这正是控制器的用途。因此,您可以避免编写自己的任何中间函数或构造函数,并将所有功能融入组件结构本身:

UserWidget = function(){
  var users =  User.load();

  return {
    'view' : function() {
      if (users())
        return m('.user', users()[0].name());
    }
  }
}

//initialize
m.module(document.body, m(UserWidget()));

Fiddle here