Titanium 钛合金-创建不带控制器的视图并访问该视图中的组件

Titanium 钛合金-创建不带控制器的视图并访问该视图中的组件,titanium,appcelerator,titanium-alloy,Titanium,Appcelerator,Titanium Alloy,我有一个钛合金视图,名为overlay.xml,没有控制器。我正在另一个名为eposion.js的控制器中创建它,并将它添加到eposion.xml中的容器中。我这样做是为了使overlay.xml成为可在任何地方添加的可重用视图 比如说 插曲.js // create the overlay view var overlay = Alloy.createController("overlay").getView(); // add it somewhere in episode.xml $.e

我有一个钛合金视图,名为
overlay.xml
,没有控制器。我正在另一个名为
eposion.js
的控制器中创建它,并将它添加到
eposion.xml
中的容器中。我这样做是为了使
overlay.xml
成为可在任何地方添加的可重用视图

比如说

插曲.js

// create the overlay view
var overlay = Alloy.createController("overlay").getView();
// add it somewhere in episode.xml
$.episodeImage.add(overlay);
var overlay = Alloy.createController("overlay");

overlay.theButton.addEventListener('click', function() {
    alert('You clicked the button from overlay.xml!');
});

var overlayView = overlay.getView();
$.episodeImage.add(overlayView);
// shorter version
$.episodeImage.add( overlay.getView() );
overlay.xml
中,我有几个组件,比如按钮和标签,我想在
剧集视图中访问这些组件来添加事件监听器。例如:

var overlay = Alloy.createController("overlay").getView();
$.episodeImage.add(overlay);

// EXAMPLE: Get the button from overlay.xml and add an event listener
$.theButtonFromOverlayXML.addEventListener("click", function () {
    alert("You clicked the button from overlay.xml!"):
});
overlay.xml

<Alloy>
    <View id="overlay">
        <Button id="theButton" title="Click Me!" />
        <Label id="theLabel" text="I am a label" />
    </View>
</Alloy>

是否可以执行此操作?

对象通过ID显示在控制器对象上。请在覆盖.getView()之前将它们显示在控制器对象上

但是,如果您只想单击侦听器,为什么不将侦听器添加到覆盖,然后检查源是否是您想要单击的?这将使视图的内部状态从消费视图中抽象出来

overlay.addEventListener('click', function(evt) {
    if (evt.source.id === 'theButton') {
        alert('You clicked the button from overlay.xml!');
    }
});

是的,您可以通过其他控制器中的视图ID访问视图。只需将控制器对象和视图对象分配给两个不同的变量:

插曲.js

// create the overlay view
var overlay = Alloy.createController("overlay").getView();
// add it somewhere in episode.xml
$.episodeImage.add(overlay);
var overlay = Alloy.createController("overlay");

overlay.theButton.addEventListener('click', function() {
    alert('You clicked the button from overlay.xml!');
});

var overlayView = overlay.getView();
$.episodeImage.add(overlayView);
// shorter version
$.episodeImage.add( overlay.getView() );

非常感谢daniula,这正是我想要的。虽然我觉得有点不舒服,因为它不能通过视图而不是控制器访问。