【问题标题】: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}”。

【问题讨论】:

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


    【解决方案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}”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多