#javascript #widget #titanium
#javascript #виджет #titanium
Вопрос:
Фрагмент кода контроллера:
Widget.xml
function buildDataInGrid(scrollView,images){
activity.show();
for (var imageInfo in images) {
var frameView = Ti.UI.createView({
item : images[imageInfo],
width : columnWidth,
height : columnHeight,
backgroundImage: WPATH('images/itemShadow.png'),
top : 0,
left : (space / 2),
right : space,
bottom : space
});
//Can be local image or from the Web
var imageLocation = images[imageInfo].location;
var imageView = Ti.UI.createImageView({
touchEnabled : false,
image:imageLocation,
borderColor:"#363636",
borderWidth:2,
top: 0,
left : 0,
width : columnWidth - (columnWidth * 0.05),
height : columnHeight - (columnHeight * 0.06)
});
frameView.add(imageView);
if (options.showTitle) {
var osname = Ti.Platform.osname;
version = Ti.Platform.version, height = Ti.Platform.displayCaps.platformHeight, width = Ti.Platform.displayCaps.platformWidth;
if (osname === 'iphone')
options.titleFontSize = 11;
var titleView = Ti.UI.createLabel({
touchEnabled : false,
text : images[imageInfo].title,
textAlign : 'center',
color : 'white',
width : columnWidth - (columnWidth * 0.051), //offset 5% of from background shadow
height : '15%',
opacity : '0.85',
left : 0,
bottom : "6%",
backgroundColor : '#363636',
font : {
fontSize : options.titleFontSize,
fontWeight: "bold"
}
});
frameView.add(titleView);
}
scrollView.add(frameView);
//Wire up Touch Events
//Single Tap
frameView.addEventListener('singletap', function(e) {
alert("You've selected : " e.source.item.title);
alert("You've selected : " e.source.item.id);
});
//Double Tap
frameView.addEventListener('doubletap', function(e) {
alert("You've selected : " e.source.item.title);
}
activity.hide();
}
photogallery.xml
<Alloy>
<Window id="win" backgroundColor="#504d4d" >
<RightNavButton >
<Button id="btnRightChat" title='Chat' onClick="rightButtonClicked"/>
</RightNavButton>
<ScrollView id="scrollGeneric" >
<View id="winContainer">
<Require type="widget" src="com.imagitechdj.imageGrid" id="imageGrid"/>
</View>
<View id = "view_indicator" width= '100' height= '100' borderRadius='10'>
<ActivityIndicator id="ind" />
</View>
<View id = "viewNoInt">
<View id='LabelIntConnectionView'>
<Label id="lblNoInt"/>
</View>
</View>
</ScrollView>
</Window>
</Alloy>
Я хочу передать переменную e.source.item.title из widget.xml к фотографии gallery.js после нажатия события щелчка, как я могу передать его?
Я использовал глобальные обработчики событий, но это приводит к утечке памяти.
ОБНОВЛЕНИЕ на основе комментария:
Widget.js
exports.addEventListener=frameView.addEventListener;
/************* Pricate Functions ************************/
function buildDataInGrid(scrollView,images){
activity.show();
for (var imageInfo in images) {
var frameView = Ti.UI.createView({
item : images[imageInfo],
width : columnWidth,
height : columnHeight,
backgroundImage: WPATH('images/itemShadow.png'),
top : 0,
left : (space / 2),
right : space,
bottom : space
});
//Can be local image or from the Web
var imageLocation = images[imageInfo].location;
var imageView = Ti.UI.createImageView({
touchEnabled : false,
image:imageLocation,
borderColor:"#363636",
borderWidth:2,
top: 0,
left : 0,
width : columnWidth - (columnWidth * 0.05),
height : columnHeight - (columnHeight * 0.06)
});
frameView.add(imageView);
if (options.showTitle) {
var osname = Ti.Platform.osname;
version = Ti.Platform.version, height = Ti.Platform.displayCaps.platformHeight, width = Ti.Platform.displayCaps.platformWidth;
if (osname === 'iphone')
options.titleFontSize = 11;
var titleView = Ti.UI.createLabel({
touchEnabled : false,
text : images[imageInfo].title,
textAlign : 'center',
color : 'white',
width : columnWidth - (columnWidth * 0.051), //offset 5% of from background shadow
height : '15%',
opacity : '0.85',
left : 0,
bottom : "6%",
backgroundColor : '#363636',
font : {
fontSize : options.titleFontSize,
fontWeight: "bold"
}
});
frameView.add(titleView);
}
scrollView.add(frameView);
//Wire up Touch Events
//Single Tap
frameView.addEventListener('singletap', function(e) {
//do something
});
//Double Tap
frameView.addEventListener('doubletap', function(e) {
});
}
activity.hide();
}
photogallery.js
$.imageGrid.addEventListener('singletap', function(e) {
alert("You've selected : " e.source.item.title);
alert("You've selected : " e.source.item.id);
});
[ERROR] : line = 161;
[ERROR] : message = "Can't find variable: frameView";
[ERROR] : name = ReferenceError;
[ERROR] : sourceId = 318245792;
Я думаю, это может быть связано с тем, что он не может найти прослушиватель событий.
Ответ №1:
Я отредактировал сообщение: вы должны экспортировать прослушиватель событий из виджета :
//add this in buildDataInGrid function
exports.addEventListener=scrollView.addEventListener;
exports.on = function(name, cb) { return scrollView.addEventListener(name, cb); };
exports.off = function(name, cb) { return scrollView.removeEventListener(name, cb); };
exports._hasListenersForEventType = function(name, flag) {
return scrollView._hasListenersForEventType(name, flag);
};
а затем в фотогалерее :
yourwidget.addEventListener('singletap', function(e) {
alert("You've selected : " e.source.item.title);
alert("You've selected : " e.source.item.id);
});
Комментарии:
1. спасибо, куда мне поместить этот код? exports.addEventListener=FrameView.addEventListener;
2. [ОШИБКА]: message = «Не удается найти переменную: FrameView»; получил эту ошибку