使用合金加速器将模型绑定到控制器视图
Posted
技术标签:
【中文标题】使用合金加速器将模型绑定到控制器视图【英文标题】:Bind model to view from controller with alloy appcelerator 【发布时间】:2014-02-03 20:43:12 【问题描述】:编辑:下面是示例:https://github.com/prakash-anubavam/alloypreloadedsqlitedb/tree/master/app 总而言之,视图 details.xml 是如何知道它从哪个模型中获取数据的?
来自 asp.net mvc,我在理解这个 MVC 时遇到了一些问题。
我可以理解如何在视图上使用表格等:
<TableView id="table" dataCollection="fighters" onClick="showId" dataTransform="transformData">
并在控制器中获取数据,我知道它将使用战斗机的全局(单例)集合,并将模型绑定到视图。
但是我遇到了一个示例(我现在真的找不到),它有一个视图,没有表格,只有一些标签和文本='variableName',我假设它来自模型。 但是控制器没有分配模型(来自 args[0],因为它总是从具有实际表的另一个控制器调用),但它从未以任何方式将模型实例分配给视图......所以问题是它是如何工作的?合金是否足够智能以检测实际模型实例并使用它?我该怎么做?像 $model = ...;或 $.details.model = ...;或类似的东西?如果从未为模型分配表或其他东西,视图如何知道从哪里获取“variableName”。
【问题讨论】:
【参考方案1】:这实际上是一个结转黑客,将来可能无法使用,according to this thread.
如果您查看示例(控制器)中的index.js
,模型由TableView
的onClick
事件分配:
function showId(e)
if (e.row.model)
var detailObj=fighters.get(e.row.model);
// Assigning to the $model actually sets this model as the one to bind too
var win=Alloy.createController('detail',"$model":detailObj);
win.getView().open();
这是一个为数据绑定自动分配的“特定”变量,它是如何在幕后工作(或在幕后工作)。
这是未记录的,不理想或不推荐。
【讨论】:
那么做细节控制器/视图的正确方法是什么?【参考方案2】:我发现 Tony Lukasavage 回答了更简洁的方法来绑定现有模型以查看: You can find it here Josiah Hester 的回答是基于它(是的,当心它有点像黑客)。
虽然,Fokke Zandbergen gave an alternative worth looking at,也许不那么老套,不知道。
扩展 Josiah 的答案,您可以执行以下操作:
在主视图上:
<Alloy>
<Collection src="modelName" />
<View id="topview" class="container">
<TableView id="tblModels" dataCollection="modelName" dataTransform="transformModel">
<Require src="rowModel"/>
</TableView>
</View>
</Alloy>
然后,在主控制器上:
//retrieve the id of the model
var thisId = e.row.thisIndex;
//pass special key $model
var detailController = Alloy.createController("detail", "$model": Alloy.Collections.detail.get(thisId) );
detailController.getView().open();
然后,在详细视图中:
<Alloy>
<View class="container" >
<Label text="id"/>
<Label text="fullName"/>
</View>
</Alloy>
在细节控制器上:什么都不做。
如果您在主控制器上有一个转换函数,它会返回一个对象,您可以在详细视图中使用它的属性,例如“fullName”。
【讨论】:
以上是关于使用合金加速器将模型绑定到控制器视图的主要内容,如果未能解决你的问题,请参考以下文章
将 [VisualStateManager] 视图状态绑定到 MVVM 视图模型?
使用 Interface Builder、NSObjectController 子类和绑定时在模型和视图之间插入控制器逻辑