我有一个带有控制器的秘银组件,该控制器已经绑定到上下文,如果我使用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,这是一个警告吗?或者这是一个错误?
答案 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
但实际上,这段代码正在复制已经内置到控制器中的功能 - 引用the Mithril API documentation for components:
可选控制器功能创建一个可以按以下推荐方式使用的对象:
[...]
基本上,您的原始应用程序代码涉及一个构造函数,该构造函数发出请求并存储对返回的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()));