跟上一篇大同小异,上一篇监听的是单个值,这里监听的是类
1.
public ReactiveProperty<TodoItem> SelectedModel = new ReactiveProperty<TodoItem>();
2.
Button.onClick.AddListener(() =>
{
SelectedModel.Value = mModel;
//Debug.Log("UITodoItem " + SelectedModel.Value.Content);
});
3.
public void AddTodoItem(UITodoItem itemPrefab, TodoItem itemData)
{
itemPrefab.Instantiate()
.Parent(this)
.LocalIdentity()
// 委托传递, 遍历传递item(即TodoItem类)到自己的 UITodoItem类的Init()方法
.ApplySelfTo(self => self.Init(itemData))
.ApplySelfTo(self => mItemViewsForData.Add(itemData, self))
.ApplySelfTo(self => self.SelectedModel.Skip(1).Subscribe(model => SelectedModel.Value = model))
//.ApplySelfTo(self => self.SelectedModel.Skip(1).Subscribe(model => Debug.Log( "UIListCtrl " + SelectedModel.Value.Content)))
.Show();
}
还有个小知识是 ReactiveCollection 是可序列化的
using QF;
using QF.Extensions;
using QF.Res;
using QFramework;
using QFramework.Afra;
using UniRx;
using UnityEngine;
/// <summary>
/// TodoApp
/// 1. 完成,未完成
/// 2. 列表/待办事项
/// 3. 增加,删除,更改待办事项
///
/// 有一个列表,列表里多个待办事项, 待办事项能够完成未完成 ,内容
/// </summary>
public class TodoListApp : MonoBehaviour
{
public TodoList mModel;
void Start()
{
ResMgr.Init();
UIMgr.SetResolution(1080, 1920, 0);
mModel = TodoList.Load();
// 打开 panel
UIMgr.OpenPanel<UITodoList>(new UITodoListData()
{
// 将Model层数据 传递到 UIPanel 控制层
Model = mModel
}) ;
}
private void OnApplicationQuit()
{
mModel.Save();
}
}
public class TodoList
{
public ReactiveCollection<TodoItem> TodoItems = new ReactiveCollection<TodoItem>();
public void AddTodo(string content)
{
var todoItem = new TodoItem();
todoItem.Content.Value = content;
TodoItems.Add(todoItem);
}
// Json 反序列化(读取)
public static TodoList Load()
{
var jsonContent = PlayerPrefs.GetString("TodoListData", string.Empty);
return jsonContent.IsNullOrEmpty() ? new TodoList() : jsonContent.FromJson<TodoList>();
}
//Json 序列化(写入)
public void Save()
{
PlayerPrefs.SetString("TodoListData ", this.ToJson());
}
}
public class TodoItem
{
public BoolReactiveProperty Completed = new BoolReactiveProperty (false);
public StringReactiveProperty Content = new StringReactiveProperty (string.Empty);
}