2016-04-04 56 views
0

onsenui和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 

任何幫助表示讚賞!

回答

0

最後,我發現一個解決方案基於Ilia Yatchev的答案,所以感謝他。

首先我用下載的jaydata文件,而不是網上的文件,因爲它包含的代碼更改,Ilia Yatchev對他的回答mentionned

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) 
1

好像都jaydata和onsenui使用window.Class,但是它們的實現顯著不同。溫泉使用約翰Resig的實現,而在jaydata的版本Class實際上是其ClassEngineBase的一個實例。至少從我的角度來看,使這兩個實現協同工作的問題在於jaydata的版本Class實際上是一個實例,而不是一個函數。如果它是一個函數,只需將擴展方法添加到jaydata的實現中就可以輕鬆地合併兩個實現。

你仍然可以嘗試做到這一點,但它不會那麼容易,如果做得不好,可能會出現一些新的錯誤。

那麼你的選擇是:

  1. 還是儘量合併實現
  2. 修改溫泉UI
  3. 修改Jaydata
  4. 等待兩個庫之一來解決該問題

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,所以我想你使用溫泉1,沒有的溫泉2. Here「薩略作修改的版本1.3.15不應該有衝突(不測試,抱歉)。

  • 在JayData他們存儲$data.Class的類,所以事實證明,只有2個地方全局的是http://include.jaydata.org/jaydata.js

    2874: $data.Class = Class = new ClassEngineBase(); 
    3342: global["$C"] = function() { Class.define.apply(Class, arguments); }; 
    
  • 使用您既可以刪除= Class從第一行,並更改第二行的這兩種情況下,從Class$data.Class,或只寫var Class;上線2873. - 其實他們似乎已經implemented this change但似乎它在網絡版的還沒有。

    1. 所以,如果你不想改變文件,我猜可能JayData可能有更新版本的地方。對於溫泉 - 溫泉1的開發已經完成,我們只在溫泉2上工作。同樣的問題可能會持續到目前的測試版,但在我們修復它之前可能不會太長。
    +0

    我驗證了jaydata.js文件,發現var Class;已存在 這裏是我找到的代碼 var Class; $ data.Class = Class = new ClassEngineBase(); 但基於這個建議,我發現了一個問題的解決方案: 通過添加引用我擴展的每個對象我將發佈一個答案更多詳細信息 謝謝! –

    +0

    很高興我能幫上忙。我們可能會在溫泉中解決這個問題,這樣它就不會引起問題,但那將會在溫泉2上。當我們解決它時,也許您可​​能有興趣使用更新的版本:) –

    +0

    是的我會等待它,感謝您 –