从另一个视图访问父视图的对象

时间:2015-12-14 16:24:03

标签: appcelerator appcelerator-mobile

当我点击datebar.xml中的标签时,showPicker()函数被触发但是datepicker视图在datepicker.xml中不可见

警报也显示为“oops”我的错在哪里?应该是一个bug?我试图解决这个问题3天。

iOS上的datepicker.js中的onDone函数也无法正常工作

提前谢谢你。我正在测试平台是iOS,我的SDK是5.1.1 GA

<Alloy autoStyle="true">
    <Window>
        <View id="ViewDateBar">
            <Require type="view" src="datebar" id="DateBar" />
        </View>
            <Require type="view" src="datepicker" id="DatePicker" />
    </Window>
</Alloy>

datebar.xml

<Alloy>
    <View id="datebar">
        <Label onClick="ShowDatePicker"/>
    </View>
</Alloy>

datebar.js

var ViewDatePicker = Alloy.createController("datepicker", {
    onDone : function(SelectedDate) {
        Alloy.Globals.JsonQsDateCurrent = SelectedDate;
    }
});

function ShowDatePicker() {
    ViewDatePicker.getView().showDatePicker();
}

datepicker.xml

<Alloy>
    <View id="datepicker" visible="false">
        <Picker id="picker" />
    </View>
</Alloy>

datepicker.js

var moment = require("alloy/moment");
var args = arguments[0] || {};
var onDone = args.onDone;

init();

function init() {

    if (OS_IOS) {
        $.picker.setType(Titanium.UI.PICKER_TYPE_DATE);
    }

}

function showDatePicker() {

    if (OS_IOS) {
        //> The iOS Picker will be slide up anddown the screen.
        $.picker.setValue(Alloy.Globals.DateCurrent.toDate());
        $.datepicker.visible = true;

    } else if (OS_ANDROID) {
        //> The Android picker will be a pop-up dialog.
        $.picker.showDatePickerDialog({
            value : Alloy.Globals.DateCurrent.toDate(),
            callback : function(e) {
                if (e.cancel) {
                    Ti.API.info('User canceled dialog');
                } else {
                    done(e);
                }
            }
        });
    }
}

function done(e) {


    if (OS_IOS) {
        hideDatePicker();
        onDone(selectedDate($.picker));
    } else if (OS_ANDROID) {
        if (!e.cancel) {
            onDone(selectedDate(e));
        }
    }

}

function hideDatePicker() {
        $.datepicker.visible = false;

}

function selectedDate(picker) {
    return moment(picker.value);
}

$.datepicker.showDatePicker = showDatePicker;
$.datepicker.hideDatePicker = hideDatePicker;

1 个答案:

答案 0 :(得分:2)

如果您在JavaScript中定义需求,则可以将引用传递给父级。

window.js:

var dateBar = Alloy.createController('datebar', {parent: $.win});

我不确定你为什么要按照自己的方式划分你的控制器。你可以这样做吗?

<Alloy autoStyle="true">
    <Window>
        <View id="ViewDateBar">
            <Require type="view" src="datebar" id="DateBar" />
        </View>
    </Window>
</Alloy>

databar.xml:

<Alloy>
   <View id="datebar">
      <Label onClick="ShowDatePicker"/>
      <Require type="view" src="datepicker" id="DatePicker" />
   </View>
</Alloy>

最后评论:在XML / TSS / JS控制器集中定义一个datepicker没有多大好处。没有大量的样式,XML / TSS方法会为您提供。为什么不简单地在标签的click事件处理程序中的代码中定义它?