onsenui和jaydata并不共存

时间:2016-04-04 00:01:15

标签: javascript onsen-ui jaydata

使用此订单时:

<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

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

似乎jaydata和onsenui都在使用window.Class,但是它们的实现差别很大。 Onsen使用John Resig的实现,而jaydata的版本Class实际上是他们ClassEngineBase的实例。至少从我的观点来看,使这两个实现一起工作的问题是,在jaydata中,版本Class实际上是一个实例而不是一个函数。如果它是一个函数,只需将extend方法添加到jaydata的实现中就可以很容易地合并这两个实现。

你仍然可以尝试这样做,但它不会那么容易,如果做得不好可能会出现一些新的错误。

所以你的选择是:

  1. 仍尝试合并实施
  2. 修改Onsen UI
  3. 修改Jaydata
  4. 等待两个库中的一个解决问题
  5. 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;
      };
    })();
    

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

    1. 您不包括angular-onsenui.js,因此我猜您使用的是onsen 1,而不是onsen 2. Here1.3.15的略微修改版本,不应该碰撞(未经测试,对不起)。

    2. 在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); };
      
    3. 您可以从第一行中删除= Class,然后将第二行的两种情况从Class更改为$data.Class,或者只在第2873行写var Class;。 - 实际上它们似乎已经有implemented this change但似乎还没有在线版本。

      1. 因此,如果您不想更改文件,我猜JayData可能会在某处更新版本。对于Onsen - Onsen 1的开发已经完成,我们只在Onsen 2上工作。同样的bug可能会在当前测试版中持续存在,但在我们修复它之前可能不会太久。

答案 1 :(得分:0)

最后我找到了一个基于Ilia Yatchev答案的解决方案,谢谢他。

首先我使用下载的jaydata文件而不是在线文件,因为它包含Ilia Yatchev在答案中提到的代码更改

var Class;
$data.Class = Class = new ClassEngineBase();

注意:订单现在不是问题

<script src="scripts/platformOverrides.js"></script>
<script src="lib/angular/angular.js"></script>
<script src="lib/onsen/js/onsenui.js"></script>
<script src="lib/datajs-1.0.3.js"></script>
<script src="lib/jaydata.js"></script>
<script src="lib/jaydatamodules/angular.js"></script>

然后在代码中我们保存创建实体的引用:

var Todo = $data.Entity.extend("Todo", {
    Id: { type: "int", key: true, computed: true },
    Task: { type: String, required: true, maxLength: 200 },
    DueDate: { type: Date },
    Completed: { type: Boolean }
});

我们保存创建的上下文的引用:

var TodoDatabase = $data.EntityContext.extend("TodoDatabase", {
    Todos: { type: $data.EntitySet, elementType: Todo }
});

然后我们可以安全地使用这些参考文献:

var todoDB = new TodoDatabase("MyTodoDatase");
todoDB.onReady(function() {
    var tasks = todoDB.Todos.addMany([
        { Task: 'Step0: Get this this list', Completed: true },
        { Task: 'Step1: Define your data model'},
        { Task: 'Step2: Initialize data storage'}
    ]);
    todoDB.saveChanges(function() {
        tasks.forEach( function(todo) { alert(todo.Id) });
    });
});

如果我没有保存对实体和上下文的引用,我会收到此错误

angular.js:12722 ReferenceError: Contact is not defined
    at Object.<anonymous> (app.js:343)
    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 extend.instance (angular.js:9380)
    at nodeLinkFn (angular.js:8497)
    at compositeLinkFn (angular.js:7929)