1

モバイルアプリに Backbone.js と StackMob を使用していますが、理解できない奇妙な問題に遭遇しました。StackMob docs によると、StackMob.Model は Backbone.Model を拡張するため、同じメソッドにアクセスでき、同じように動作するはずです。私が理解しているように、それは簡単な交換です。

状況は次のとおりです。

リストとしてビューにレンダリングされているFourSquareへのAPI呼び出しによって設定されているコレクションがあります。リスト内の各モデルは、data-id 属性でレンダリングされます。

    $("ul#resultsList").append("<li class='result' data-id='" + place.get('id') + "'><span class='listingName'>" + place.get("name") + "</span><span class='listingDetail'>" + place.get("location")["address"] + "</span><span class='listingDetail'>" + place.category + "</span></li>");

(上記のコードは、リストを構築するためにループされるものです)。

リストは正常に表示され、その端のすべてが正常に機能します。次に、各リスト項目のクリック イベントに以下を追加します。

saveItem: function(e) {
    window.item = $(e.currentTarget).data("id");
    window.newplace = this.collection.get(window.item);
    console.log("New place: "+ window.newplace); //shows the model in Backbone, undefined in StackMob
    App.navigate("#add", {
        trigger: true
    });
},

このコードは基本的に、クリックされた項目を調べて ID を取得し、ID に基づいてコレクション内のそのモデルを検索し、window.newplace に格納します。

次に、アプリは #add に移動し、モデルとして window.newplace を使用してビューをインスタンス化します。

addItem: function() {
    if (!window.newplace) {
    window.newplace = new Place({});
    }
    this.changePage(new AddItemView({model:window.newplace}), "slide");
},

問題は次のとおりです。

これは、Place モデルが Backbone.Model として設定されている場合とまったく同じように機能します。StackMob.Model に切り替えるとすぐに、window.newplace が未定義として表示されます。

これらを切り替えることで違いが生じる理由は想像できませんが、一見違いはあります。

完全に明確にするために、Stackmob.Model を使用する場合のモデルを次に示します。

window.Place = StackMob.Model.extend({
...
});

何か案は?まったく機能しない場合は、本当にばかげたことにチョークで書きますが、Backbone の拡張では問題なく機能しますが、StackMob では機能しないため、私は本当に混乱しています。

ありがとう!

4

2 に答える 2

1

わかりました、この問題の回避策を見つけました。

これが取引です。を呼び出したとき、クリックさthis.collection.get(window.item)れたオブジェクトの ID プロパティを探していましたPlace(その ID を URL に渡しているので、クリックすると簡単に取得できます)。

Backbone では、その ID はオブジェクトのルート プロパティとして place.id に表示されていました。StackMob では、何らかの理由でそうではありませんでした。内部の Attributes オブジェクトに格納されていましたPlace( を呼び出したかのようにplace.set("id"))。

そのため、ID で取得しようとすると、StackMob はオブジェクトのルート プロパティ「id」を探していましたが、見つからず、「未定義」を返しました。

モデルの初期化を入れるthis.id = this.get("id")ことで、ルートに到達し、モデルを正常に取得できました。

なぜその ID が Backbone でルートに設定されていたのかはまだわかりませんが、StackMob では設定されていませんが、少なくとも解決策はあります。

于 2012-11-30T01:41:23.680 に答える
1

StackMob.Model、StackMob.Collection およびその他の StackMob アイテムを使用する前に、まず StackMob.init(..) を呼び出す必要があります。

StackMob.init(..) を呼び出す前に、外部スクリプトが実行されている可能性があります。

それが役立つことを願っています!

エリック

于 2012-11-30T00:52:54.020 に答える