0

私は、ユーザーがいくつかのオプションを選択して結果を取得できる検索画面で作業しています。ユーザーがチェックボックスをオンにすると、AJAXリクエストが行われ、結果が画面に表示されます。したがって、検索には「検索」ボタンがなく、オプションが選択されるとクエリが開始されます。

UIにはKnockoutJSを使用し、ルートにはSammyを使用しています。検索オプションはobservableArrayにバインドされています。問題は、location.hashをどこに設定できるかわからないことです。私が今使っているのはサブスクライブ機能です。KnockoutJSチュートリアルで、クリックがハッシュを設定する関数にバインドされていることを確認しましたが、ここでは、チェックボックスごとにクリック関数を作成する必要はないと思います。また、多すぎると思います。

ここでフィドル

HTML:

<input type="checkbox" value="1" data-bind="checked:sizeOptions" /> Size 1
   <br />
<input type="checkbox" value="2" data-bind="checked:sizeOptions" /> Size 2
   <br />

<br />
​
<div data-bind="text: ko.toJSON($root.sizeOptions)"></div>
Calls: <div data-bind="text: $root.calls"></div>​

モデル:

​function SearchModel() {
     var self = this;
     self.calls= ko.observable(0);
     self.sizeOptions = ko.observableArray([]);

     // Should this be a Behaviour? (like click: goToFolder). This would be called on the Sammy rout also

     self.sizeOptions.subscribe(function () {
         var _calls = self.calls();
         _calls = _calls + 1;
         self.calls(_calls);
         location.hash = "o=" + self.sizeOptions().join();
         console.log("subscribe");
     });

     Sammy(function() {
         this.get('#o=:o', function() {
            self.sizeOptions(this.params.o.split(','));
            console.log("Sammy get");
            // do an AJAX request and place the results in an observableArray
         });

    }).run(); 
}
ko.applyBindings(new SearchModel());
​
4

1 に答える 1

2

修正は簡単で効果的でした。「subscribe」メソッドを使用する代わりに、ハッシュを設定するko.computed呼び出しを追加しました。

この呼び出しは「スロットル」エクステンダーで装飾されているため、関連するオブザーバブルが実質的に同時に変更されると、ハッシュは1回だけ設定されるため、Sammyはルートを1回だけインターセプトします。これにより、AJAXリクエストが含まれる場合は大幅に節約できます。

ここでフィドル

于 2012-08-15T19:34:14.740 に答える