-
Notifications
You must be signed in to change notification settings - Fork 207
装配ViewModel
xuwhale6 edited this page Aug 27, 2020
·
17 revisions
我们提供自动装配和手动装配来简化ViewModel数据源的赋值。
一般情况下,我们ViewModel
的数据源来自网络请求,因此提供自动装配,可将网络请求返回的json串自动解析作为ViewModel
的默认数据。
1. ag声明式代码中,在preview
里实现autoWired
方法,将json
串和ViewModel
相关联,并返回ViewModel
。
function autoWired(origin, viewModel, extra)
--origin:网络请求获取的json数据
--json串和ViewModel对应即可
--如下:取json串中key="data"对应的value解析为viewmodel。根据实际情况自行实现。
viewModel = origin.data
return viewModel
end
2. 打包
3. 打包之后生成的ViewModel
提供autoWired
方法将网络请求返回的json串自动解析作为ViewModel
的默认数据。
--关键代码如下:调用autoWired方法。
--iOS:
[self.model autoWired:_origin extra:nil complete:^(__kindof NSObject * _Nonnull model, NSError * _Nonnull error) {
printf("装配完毕");
}];
--Android:
viewModel.autoWired(json, viewModel, new SingleThreadExecutor.ExecuteCallback() {
@Override
public void onComplete() {
System.out.println("json--->onComplete");
}
@Override
public void onError(RuntimeException e) {
System.out.println("json--->onError=" + e.getMessage());
}
});
-
iOS自动装配
在ViewController.m中添加如下代码:
#import <MLNUIKit.h>
#import "ViewController.h"
#import "MovieData.h"
@interface ViewController ()
@property() MovieData *model;
@end
@implementation ViewController{
NSDictionary *_origin;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 创建一个MLNUIViewController示例
MLNUIViewController *viewController = [[MLNUIViewController alloc] initWithEntryFileName:@"chat_demo/VChatMovieList.lua" bundleName:@"MLNUIDemoTestMUI"];
// 读取json数据
_origin = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"MovieData.plist" ofType:nil]];
self.model = [MovieData new];
//调用autoWired方法,自动装配
[self.model autoWired:_origin extra:nil complete:^(__kindof NSObject * _Nonnull model, NSError * _Nonnull error) {
printf("装配完毕");
}];
[viewController bindData:self.model forKey:@"MovieData"];
// 3.添加到指定的控制器上.
[viewController mlnui_addToSuperViewController:self frame:self.view.bounds];
}
-
Android自动装配
在Activity、Fragment或任意view中显示LuaView及Databingding使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//声明对象
argo = new Argo(this);
//是否打开debug按钮
argo.showDebugButton(true);
//加载lua文件
argo.loadAssetsUI("VChatMovieList.lua");
//ViewModel绑定,提供autoWired方法,将网络请求返回的json串自动解析作为`ViewModel`的默认数据。
MovieDataViewModel viewModel = new MovieDataViewModel();
//传入网络请求后的json串 和 viewModel
viewModel.autoWired(json, viewModel, new SingleThreadExecutor.ExecuteCallback() {
@Override
public void onComplete() {
System.out.println("json--->onComplete");
}
@Override
public void onError(RuntimeException e) {
System.out.println("json--->onError=" + e.getMessage());
}
});
argo.bind(viewModel);
}
@Override
protected void onPause() {
super.onPause();
argo.onPause();
}
@Override
protected void onResume() {
super.onResume();
argo.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
argo.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (argo.onActivityResult(requestCode, resultCode, data))
return;
super.onActivityResult(requestCode, resultCode, data);
}
编写demo.ag
代码时,我们通常在preview
中初始化数据源。打包之后将preview
的数据源作为ViewModel
的默认数据,即为手动装配。
1. ag声明式代码中,在preview
里构造数据源
2. 打包
3. 打包之后生成的ViewModel
提供defaultUserData
方法将preview
的数据源作为ViewModel
的默认数据。
--关键代码如下:调用defaultUserData方法。
--iOS:
self.model = [MovieData defaultUserData];
--Android:
MovieDataViewModel viewModel = MovieDataViewModel.defaultUserData();
-
iOS手动装配
在ViewController.m中添加如下代码:
#import <MLNUIKit.h>
#import "ViewController.h"
#import "MovieData.h"
@interface ViewController ()
@property() MovieData *model;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 创建一个MLNUIViewController示例
MLNUIViewController *viewController = [[MLNUIViewController alloc] initWithEntryFileName:@"chat_demo/VChatMovieList.lua" bundleName:@"MLNUIDemoTestMUI"];
//手动装配:ViewModel调用`defaultUserData`方法将`preview`的数据源作为`ViewModel`的默认数据。
self.model = [MovieData defaultUserData];
[viewController bindData:self.model forKey:@"MovieData"];
// 3.添加到指定的控制器上.
[viewController mlnui_addToSuperViewController:self frame:self.view.bounds];
}
-
Android手动装配
在Activity、Fragment或任意view中显示LuaView及Databingding使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//声明对象
argo = new Argo(this);
//是否打开debug按钮
argo.showDebugButton(true);
//加载lua文件
argo.loadAssetsUI("VChatMovieList.lua");
//ViewModel绑定,提供defaultUserData方法,将argo源文件中的preview数据作为初始数据,即手动装配
MovieDataViewModel viewModel = MovieDataViewModel.defaultUserData();
argo.bind(viewModel);
}
@Override
protected void onPause() {
super.onPause();
argo.onPause();
}
@Override
protected void onResume() {
super.onResume();
argo.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
argo.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (argo.onActivityResult(requestCode, resultCode, data))
return;
super.onActivityResult(requestCode, resultCode, data);
}