dojox.mobile.ListItem - 通过单击/触摸传递参数

时间:2012-10-22 13:29:07

标签: javascript list mobile dojo

我有这段代码:

<ul data-dojo-type="dojox.mobile.RoundRectList">

  <li data-dojo-type="dojox.mobile.ListItem" data-dojo-props='moveTo:"places_aroud_me_view",callback: set_placeTypeAroundMe_calback("park"),transition:"slide"'>Park</li>

  <li data-dojo-type="dojox.mobile.ListItem" data-dojo-props='moveTo:"places_aroud_me_view",callback: set_placeTypeAroundMe_calback("art"),transition:"slide"'>Art</li>

</ul>

如您所见,使用了calback,它引用了带参数的specyfic函数。基本上它不起作用因为代码总是启动所有回调中的所有函数(控制台日志将一个接一个地显示所有调用)。

如果我这样做:

<li data-dojo-type="dojox.mobile.ListItem" data-dojo-props='moveTo:"places_aroud_me_view",callback: set_placeTypeAroundMe_calback,transition:"slide"'>Park</li>

calback工作得很好。一键 - &gt;一个回调。

那么....我怎样才能将参数传递给calback中的js函数? 我想要做的是设置一个全局的js变量值,所以在下一个dojo移动视图中(点击后)我有权访问这个变量(并使用它来做某事,在这里检查地点类型)。

如果以这种方式传递参数是不可能的,那么也许有人知道将变量从一个dojo移动视图传递到另一个(最好是使用列表)的其他方法吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你可以看看Dojo Mobile Showcase的一个例子: http://demos.dojotoolkit.org/demos/mobileCharting/demo.html Soruces被压缩了一点,所以它们不会给你清晰的画面。 无论如何... 看起来非常类似于您的设置。列出具有多个目标视图的li-s的视图。

您可以以编程方式创建listitem元素(在创建时附加事件),或者稍后通过向其添加id属性(或使用dojo的查询功能)来获取它们。

function something(item){
     require(["dojo/dom-attr"], function(domAttr){
          var data = domAttr.get(item,"customattribute");//use your data
          //work with destination view
     });
}

require(["dojo/dom","dojo/on"], function(dom,on){ 
    var item = dom.byId("listitem1");
    on(item,"click", something(item));
});

这只是一个普遍的想法,您可以使用dojo / query对其进行扩展,以一次获取所有列表项,并使用包含数据的自定义属性扩展列表项。 e.g。

<li customattribute="data" data-dojo-type="dojox.mobile.ListItem" ...

答案 1 :(得分:0)

这是:

<li id="park" class="places_around_me_list" data-dojo-type="dojox.mobile.ListItem" data-dojo-props='moveTo:"places_aroud_me_view",transition:"slide"'>Park</li>

<li id="art" class="places_around_me_list" data-dojo-type="dojox.mobile.ListItem" data-dojo-props='moveTo:"places_aroud_me_view",transition:"slide"'>Art</li>


require(["dojo/dom", "dojo/query", "dojo/on", "dojo/dom-attr", "dojo/domReady"], function(dom, dquery, on, domAttr){
    node = dquery(".places_around_me_list");
    on(node, "touchstart", function(e){
        id = domAttr.get(this, "id");
        //console.log("Clicked id:" + id);
        set_placeTypeAroundMe_reference(id);
    });     
});

请注意,在桌面上你需要将事件附加到“点击”,而在移动设备上,这个解决方案将具有与我在下面提到的“回调”相同的效果(总是最后一次运行...)。同样在移动......如警报将阻止dojo移动“moveTo”的工作...所以基本解决方案并不完美。任何替代方案?

编辑: 好的,这里有一个代码,可用于点击手机。它看起来完全稳定:

require(["dojo/dom", "dojo/query", "dojo/on", "dojo/dom-attr", "dojo/domReady"], function(dom, dquery, on, domAttr){
    node = dquery(".places_around_me_list");
    dquery(".places_around_me_list").forEach(function(item){
        on(item, "click", function(e){
        id = domAttr.get(item, "id");
        set_placeTypeAroundMe_reference(id);
        });
    });     
});

EDIT2:有时在dojo mobile中你可能会遇到这个错误 - &gt;在您从触摸屏上拿走手指之前,您可以启动完全不需要的操作或响应(例如,在您将手指移开之前,将一个列表替换为新列表)。这应该有所帮助:

on(item, touch.release, function(e){...}
相关问题