使用合金加速器将模型绑定到控制器视图

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,模型由TableViewonClick 事件分配:

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 视图模型?

如何将数据从剃刀视图传递到 mvc3 中的控制器?

使用自定义模型绑定器的递归模型绑定

是否可以将模型数据从视图发送到不是该视图的控制器的控制器?

SAPUI5 何时将初始过滤器绑定到控件

使用 Interface Builder、NSObjectController 子类和绑定时在模型和视图之间插入控制器逻辑