使用此命令时:

<script src="lib/angular/angular.js"></script>
<script src="lib/onsen/js/onsenui.js"></script>
<script src="http://include.jaydata.org/datajs-1.0.3.js"></script>
<script src="http://include.jaydata.org/jaydata.js"></script>
<script src="http://include.jaydata.org/jaydatamodules/angular.js"></script>


我得到这个错误

TypeError: Class.extend is not a function
    at Object.<anonymous> (onsenui.js:13049)
    at Object.invoke (angular.js:4535)
    at Object.enforcedReturnValue [as $get] (angular.js:4387)
    at Object.invoke (angular.js:4535)
    at angular.js:4352
    at getService (angular.js:4494)
    at Object.invoke (angular.js:4526)
    at Object.enforcedReturnValue [as $get] (angular.js:4387)
    at Object.invoke (angular.js:4535)
    at angular.js:4352


当使用此命令时:

<script src="lib/angular/angular.js"></script>
<script src="http://include.jaydata.org/datajs-1.0.3.js"></script>
<script src="http://include.jaydata.org/jaydata.js"></script>
<script src="http://include.jaydata.org/jaydatamodules/angular.js"></script>
<script src="lib/onsen/js/onsenui.js"></script>


注意:已修​​改以更正订单

jaydata.js:3342 Uncaught TypeError: Cannot read property 'apply' of undefined


任何帮助表示赞赏!

最佳答案

看来jaydata和onsenui都在使用window.Class,但是它们的实现却大不相同。 Onsen使用John Resig的实现,而在jaydata的版本中,Class实际上是其ClassEngineBase的一个实例。至少从我的角度来看,使这两个实现一起工作的问题是,在jaydata的版本中,Class实际上是实例而不是函数。如果这是一个函数,那么只需将扩展方法添加到jaydata的实现中,就很容易合并这两种实现。

您仍然可以尝试执行此操作,但这并没有那么容易,如果执行不正确,可能会出现一些新的错误。

因此,您的选择是:


仍然尝试合并实现
修改温泉用户界面
修改Jaydata
等待两个库之一解决此问题


1。
序列:[jaydataonsenuipatch],其中patch是onsenui版本的修改版本。

(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
  this.Class.extend = function(prop) {
    var _super = this.prototype || {};
    initializing = true;
    var constructor = typeof this === 'function' ? this : function(){};
    var prototype = new constructor();
    initializing = false;

    for (var name in prop) {
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;
            this._super = _super[name];
            var ret = fn.apply(this, arguments);
            this._super = tmp;
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }

    function Class() {
      if (!initializing && this.init)
        this.init.apply(this, arguments);
    }

    Class.prototype = prototype;
    Class.prototype.constructor = Class;
    Class.extend = arguments.callee;
    return Class;
  };
})();


但是,我还没有真正测试它是否可行,并且可能存在一些问题。


您不包括angular-onsenui.js,所以我想您使用的是onsen 1,而不是onsen2。Here1.3.15的略微修改版本,不应有冲突(未经测试,对不起)。
在JayData中,他们将类存储在$data.Class中,因此事实证明,在http://include.jaydata.org/jaydata.js中只有2个地方使用了全局位置。

2874: $data.Class = Class = new ClassEngineBase();
3342: global["$C"] = function () { Class.define.apply(Class, arguments); };



您可以从第一行中删除= Class并将第二行的两种情况都从Class更改为$data.Class,或者仅在第2873行中写var Class;。-实际上,他们似乎已经有了implemented this change,但是好像还没有在线版本。


因此,如果您不想更改文件,我想也许JayData可以在某个地方提供更新的版本。对于Onsen-Onsen 1的开发已经完成,我们仅在Onsen 2上进行开发。同一bug可能会在当前Beta中持续存在,但在修复之前可能不会太久。

关于javascript - onsenui和jaydata不共存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36392774/

10-09 17:48