1

我有一个使用 jquery、jquery mobile 和 requireJS (2.0) 的工作项目。现在我在将 jquery.mobile.iscrollview 集成到 requireJS 世界时遇到了问题。

我的 requirejs 配置如下所示:

(function (require) {
    "use strict";
    require.config({
        paths:{
            'angular':'../external-libs/angular-1.0.3',
            'jquery':'../external-libs/jquery-1.7.2',
            'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
            'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
            'moment': '../external-libs/moment-1.6.2.min',
            'iscroll': '../external-libs/iscroll',
            'iscrollview': '../external-libs/jquery.mobile.iscrollview'
        },
        shim:{
            'angular':{ deps:['jquery'], exports:'angular' },
            'iscroll':{ deps:['jquery'], exports:'iscroll' },
            'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' }
        }
    });

    require([
        "jquery",
        "jquery.mobile",
        "adapter",
        "moment",
        "iscroll",
        "iscrollview",
        "myApp"
    ], function () {
    //
    });
  }(require));

这工作得很好,只要 requireJS 优化器没有在生产模式下运行,只有一个大的 JS 文件应该提供给客户端。即使将优化器设置为不优化任何东西(优化:无),它也只是将所有 js 文件连接在一起,它不起作用。

加载网站时的错误消息是

未捕获的类型错误:无法读取未定义的属性“ignoreContentEnabled”

它发生在文件“jquery.mobile.iscrollview.js”中,从代码中可以明显看出,在解析文件时 $.mobile 对象尚不可用,因为它仅在 jquery 就绪事件之后创建(我思考)。

知道如何解决这个问题吗?

谢谢!

马可

4

2 回答 2

2

现在通过将 jquery.mobile.iscrollview 转换为 AMD 模块,我自己解决了这个问题。像这样:

 define(function () {


    function iScrollView($) {
        //here comes the iscrollview code, but without event handler to pagecreate
    }

    jQuery(document).bind("pagecreate", function (e) {
        "use strict";
        iScrollView(jQuery); //this is doing the init stuff that normally happens
                             //when script is loaded, lines after this are the 
                             //original event handler

        var elements = jQuery(e.target).find(":jqmData(iscroll)");
        elements.iscrollview();
    });

    return iScrollView;

});
于 2013-02-01T07:53:20.040 回答
0

这里的问题可能是加载时间与 jQuery 核心运行时间。(这就是为什么我个人更喜欢 CurlJS。从来没有时间问题)

尽管如此,如果配置系统的笨拙让您失望,请自行控制并明确声明顺序:

require.config({
    paths:{
        'angular':'../external-libs/angular-1.0.3',
        'jquery':'../external-libs/jquery-1.7.2',
        'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
        'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
        'moment': '../external-libs/moment-1.6.2.min',
        'iscroll': '../external-libs/iscroll',
        'iscrollview': '../external-libs/jquery.mobile.iscrollview'
    }
});

require(["jquery"], function($){
    require(["angular", "jquery.mobile"], function(angular){
        require(["adapter","iscroll"], function(){
            require(["myApp","moment","iscrollview"], function(myApp){
                // do something with
                myApp, $, angular
            })
        })
    })
})

我不知道“时刻”是什么,所以把它放在最后,因为根据你的垫片结构,它不依赖于任何东西。

于 2013-02-01T01:05:46.280 回答