使用合金appcelerator绑定模型以从控制器查看

时间:2014-02-03 20:43:13

标签: model-view-controller titanium appcelerator titanium-alloy

编辑:以下是示例:https://github.com/prakash-anubavam/alloypreloadedsqlitedb/tree/master/app 并且sumarizing,视图details.xml如何知道从哪个模型获取数据?


来自asp.net mvc,我有一些理解这个MVC的问题。

我可以理解如何在视图中使用表格等:

<TableView id="table" dataCollection="fighters" onClick="showId" dataTransform="transformData">

获取控制器中的数据,我知道它将使用全局(单例)战斗机集合,并将模型绑定到视图。

但是我遇到了一个例子(我现在真的找不到)它有一个View,没有表格,只有一些标签和text ='{variableName}',我认为它来自模型。 然而,控制器没有分配模型(来自args [0],因为它总是从具有实际表的另一个控制器调用),但它从未以任何方式将模型实例分配给视图...所以问题是它是如何工作的?合金是否足够智能以检测实际模型实例并使用它?我该怎么办?像$ model = ...;或$ .details.model = ...;或类似的东西?如果模型从未分配过表或其他内容,那么视图如何知道从哪里取“{variableName}”。

2 个答案:

答案 0 :(得分:2)

这实际上是一种遗留问题,将来可能无效,according to this thread.

如果您查看示例(控制器)中的index.js,模型将由onClick的{​​{1}}事件分配:

TableView

这是一个自动分配给数据绑定的“specai”变量,它是如何在封面下工作的(或者在封面下工作)。

这是没有记录的,不理想或不推荐。

答案 1 :(得分:1)

我发现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}”。