2014-06-26 94 views
0

我正在閱讀Building a Collaborative Data Model上的Google Drive Realtime API文檔。我可以在自定義類型中放置一個CollaborativeString嗎?

我真的很喜歡gapi.drive.realtime.databinding.bindString的行爲方式。當多人在同一個文本框中輸入時,它不會弄亂您的光標位置。但它需要你傳遞一個CollaborativeString。

但是,如果您註冊了自定義類型,無論您定義了哪種類型的字段,都必須使用gapi.drive.realtime.custom.collaborativeField,並且無法將其中的一個傳遞給bindString。事實上,collaborativeField類型似乎沒有記錄在任何地方,並且在控制檯中檢查它顯示它沒有方法。這意味着沒有registerReference方法,CollaborativeString使用它來跟蹤光標位置。

多麼令人沮喪。所以我想我必須解決它。我看到幾個選項:

  1. 忽視的事實是,光標被合作
  2. 使用CollaborativeMap而不是自定義類型的過程中搞砸了,並在運行時與我的自定義類型的包裝它

可能要做的選項2.

+0

這應該是可能的..你能準確地顯示你在做什麼,以及具體的錯誤信息? –

+0

如果可能的話,告訴我如何去做。這似乎不可能。 –

回答

0

我想你誤解了這個網站的工作原理,責任不在於其他人告訴你如何做某事 - 你要求別人從他們的一天中抽出時間幫助你。

這就是說,快速瀏覽一下你鏈接的頁面,顯示你想要做的不僅是可能的,而且非常簡單,並且與bindString兼容。從示例代碼竊取該頁面:

// Call this function before calling gapi.drive.realtime.load 
function registerCustomTypes() 
{ 
    var Book = function() { }; 

    function initializeBook() 
    { 
     var model = gapi.drive.realtime.custom.getModel(this); 

     this.reviews = model.createList(); 
     this.content = model.createString(); 
    } 

    gapi.drive.realtime.custom.registerType(Book, 'Book'); 

    Book.prototype.title = gapi.drive.realtime.custom.collaborativeField('title'); 
    Book.prototype.author = gapi.drive.realtime.custom.collaborativeField('author'); 
    Book.prototype.isbn = gapi.drive.realtime.custom.collaborativeField('isbn'); 
    Book.prototype.isCheckedOut = gapi.drive.realtime.custom.collaborativeField('isCheckedOut'); 
    Book.prototype.reviews = gapi.drive.realtime.custom.collaborativeField('reviews'); 
    Book.prototype.content = gapi.drive.realtime.custom.collaborativeField('content'); 

    gapi.drive.realtime.custom.setInitializer(Book, initializeBook); 
} 

// Pass this as the 2nd param to your gapi.drive.realtime.load call 
function onDocLoaded(doc) 
{ 
    var docModel = doc.getModel(); 
    var docRoot = docModel.getRoot(); 

    setTimeout(function() 
    { 
     var book = docModel.create('Book'); 

     book.title = 'Moby Dick'; 
     book.author = 'Melville, Herman'; 
     book.isbn = '978-1470178192'; 
     book.isCheckedOut = false; 

     book.content.setText("Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."); 

     docRoot.set('tbook', book); 

     debugger; 
    }, 0); 
} 

祝你好運,有樂趣的實時API - 這是一個很大的好玩。

+0

你從哪裏找到這個示例代碼?我在鏈接的頁面上看不到它。 –

+0

嗨尼克 - 它分佈在「註冊和創建自定義對象」和「初始化程序」部分下的頁面上。他們提供的示例代碼不使用CollaborativeString,而是使用CollaborativeList。 –

+0

這個例子看起來很奇怪。起初,它看起來像是通過將CollaborativeString放在合作字段上來打破合作字段屬性。我想這會增強它?我不知道爲什麼他們讓這個系統變得如此奇怪,以至於你不得不在初始化時摧毀你的字段,而不是最初將它們聲明爲它們應該是的類型... –

0

我知道這個問題和答案已經越來越老了,但僅供參考,就是Grant Watters非常好的答案,即onDocLoaded例程的最後一部分,頗具誤導性。該函數的寫法更適合gapi.drive.realtime.load調用的第三個參數onInitializeModel回調。

每次加載Doc時都調用第二個參數。你通常不會一遍遍添加相同的對象根據上述程序會......相反,你通常會設置你的事件處理,你dataBinds等該版本可能有所澄清:

// Pass this as the 2nd param to your gapi.drive.realtime.load call 
function onDocLoaded(doc) 
{ 
    var docModel = doc.getModel(); 
    var docRoot = docModel.getRoot(); 
    var text = doc.getModel().getRoot().get("text"); 

    // Add an event listener... 
    text.addEventListener(gapi.drive.realtime.EventType.TEXT_INSERTED, onStringChanged); 

    // ...and/or bind to collaborative objects: 
    var textArea = document.getElementById('textArea1') 
    textBinding = gapi.drive.realtime.databinding.bindString(text, textArea); 

    etc... 
} 

並非偶然,bindString返回綁定對象,該對象稍後需要「解除綁定」,防止在加載下一個Doc時出現AlreadyBound錯誤或其他意外行爲。做這樣的事情:

function onDocLoaded(doc) 
{ 
    // Clear any previous bindings etc: 
    if (textBinding) { textBinding.unbind() }; 
    textBinding = null; 

    etc... 
相關問題