2011-06-18 17 views
1

backbone.jsとmodel.save()メソッドに問題があります。 3つのライブラリを必要とせずに完全な例を以下に示しました。モデル保存時のBackbone.jsの問題

私は、タグモデル、タグコレクションモデル、および検索基準と呼ばれるUIで選択したアイテムを表すモデルを持っています。

タグの検索条件のコレクションを操作した後にモデルを保存しようとすると、URLエラーが発生します。この例は、この問題を示しています。

この例のsaveの最後の呼び出しで、バックボーンはタグコレクションモデルで定義されているURLを解決できないようです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Test</title> 
    <script src="Scripts/Libraries/jquery-1.6.1.js" type="text/javascript"></script> 
    <script src="Scripts/Libraries/underscore.js" type="text/javascript"></script> 
    <script src="Scripts/Libraries/backbone.js" type="text/javascript"></script> 

    <script language="javascript" type="text/javascript"> 

     $(function() { 

      // Simple model for a tag. Tags have an id and a title. 
      var TagModel = Backbone.Model.extend({}); 

      // Collection for tags. 
      var TagCollection = Backbone.Collection.extend({ 
       model: TagModel, 
       url: "tags" 
      }); 

      // Sample model to hold a set of "selected" search criteria. 
      // Includes search text and a collection of "selected" tags. 
      var SearchCriteriaModel = Backbone.Model.extend({ 
       defaults: { 
        "searchText": "", 
        "tags": new TagCollection() 
       } 
      }); 

      // Create master tags collection. 
      window.tags = new TagCollection(); 
      window.tags.refresh([ 
       { id: 1, title: "Tag A" }, 
       { id: 2, title: "Tag B" }, 
       { id: 3, title: "Tag C" } 
      ]); 

      // Create search criteria. 
      window.searchCriteria = new SearchCriteriaModel(); 

      // Should be 3 tags. 
      console.log("Should be 3 tags in master tags list."); 
      console.log("Count = " + window.tags.size()); 

      // Should be 0 tags in criteria collection. 
      console.log("Should be 0 selected tags."); 
      console.log("Count = " + window.searchCriteria.get("tags").size()); 

      // Update tag title for tag 1. 
      var tag = window.tags.get(1); 
      tag.set({ "title": "Tag AA" }); 

      // Save tag. 
      console.log("Try to save tag. Should attempt PUT to /tags/1. WORKS.") 
      tag.save(); 

      // Add tag to search criteria. 
      window.searchCriteria.get("tags").add(tag); 

      // Should be 1 tag in criteria collection now. 
      // I am not moving the tag, but rather wanting to simply add a reference to the tag to the 
      // criteria collection. 
      console.log("Should be 1 selected tags."); 
      console.log("Count = " + window.searchCriteria.get("tags").size()); 

      // Should STILL be 3 tags in the master list. 
      console.log("Should be 3 tags in master tags list."); 
      console.log("Count = " + window.tags.size()); 

      // Update tag title for tag 1 again. 
      var tag = window.tags.get(1); 
      tag.set({ "title": "Tag AAA" }); 

      // Save tag. 
      console.log("Try to save tag. Should attempt PUT to /tags/1. WORKS.") 
      tag.save(); 

      // Remove tag from criteria. Simulates someone "deselecting" a tag from the search. 
      window.searchCriteria.get("tags").remove(tag); 

      // Should be 0 tags selected. 
      console.log("Should be 0 selected tags."); 
      console.log("Count = " + window.searchCriteria.get("tags").size()); 

      // Save tag. FAILS. 
      console.log("Try to save tag. Should attempt PUT to /tags/1, but does not. Instead throws error 'A url property or function must be specified'."); 
      tag.save(); 

     }); 

    </script> 

</head> 
<body> 
    <h1>Test</h1> 
    <p>Backbone test page.</p> 
</body> 
</html> 

ありがとう!

を更新し

私はコレクション間のタグを動かすのではなく、第二のコレクションにタグへの参照を追加するわけではないことを説明を助けるために、コードを更新しました。次に、2番目のコレクション(最初のコレクションではない)からタグを削除すると、バックボーンは最初のコレクションを解決できず、保存するURLを取得できません。

1つのコレクションからタグを削除すると、別のコレクション内のそのタグへの参照に影響することがあるのは混乱します。

私はC#の背景から来ています。たぶん、オブジェクトとコレクションの動作が違うかもしれません。

答えて

1

あなたが実行されているタグの2つのコレクション(ウィンドウ上の1とあなたのSearchCriteriaModelで定義されたもの)を持って、あなたがこのコード行を実行すると2つのコレクション

間のタグを動いているように表示されます。

window.searchCriteria.get("tags").remove(tag); 

タグとコレクションの間のリンクが失われます。URLはコレクションから決定されます。

上記の行を削除すると、あなたのタグはwindow.tagsコレクションのURLになるので保存されます。

Ps。良い質問ですが、うまく書かれた、うまく書式設定されたコードサンプルで問題を実演しています。これはあなたの問題を解決するかどうか

+0

感謝を変更する必要があります。私はタグを「動かす」とは思わない。マスタータグコレクションは私の主要なタグリストです。検索条件タグコレクションは、「選択された」タグを格納するために使用されます。私は両方のコレクションのタグへの参照を持っていると思っています。メインコレクションはタグのリストを表示するために使用され、もう1つのコレクションは選択されたタグを追跡するために使用されます。タグが基準コレクションから削除されたときにコレクション参照が失われる理由がわかりません。タグは依然としてメインコレクションの一部です。 – Kevin

+0

http://otocumentcloud.github.com/backbone/docs/backbone.htmlの注釈付きbackbone.jsソースコードを確認すると、collection.remove(モデル)を実行すると、コレクションへのリンクがクリアされることがわかりますmodel.collection)を削除します。私は私の答えによって立つ。モデルには、コレクションへのナビゲート可能なリンクが1つしかありません。そのリンクは、モデルがURLを決定するために使用できる2つの方法の1つです。 –

+0

私はあなたの答えに疑問を抱くつもりはありませんでした。ごめんなさい。私は今よく理解する。私はタグの "検索基準"のコレクションを扱う別の方法を理解する必要があると思います。タグはこのコレクションから何度も追加されたり削除されたりしますが、マスターコレクション(tactのコレクション参照)に残る必要があります。あるコレクションからタグを削除すると、この参照は破棄されますが、コレクション、私は何か別のものを思いつくだろう。再度、感謝します! – Kevin

0

は分からないのですが、あなたは最初にあなたのURLに「/タグ」だけではなく、「タグ」

+0

ありがとうございますが、それは問題ではありません。私はバックボーンに関連して発生する問題に焦点を当てています。バックボーンは最終的な保存のための呼び出しの際にURLを解決することすらできます。 – Kevin

関連する問題