Skip to content

装配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);
    }
Clone this wiki locally