使用带有Sammy路径的KnockoutJS observableArray

时间:2012-08-09 12:46:45

标签: knockout.js sammy.js

我正在搜索屏幕上,用户可以选择多个选项并获得结果。当用户选中复选框时,会发出AJAX请求并在屏幕上显示结果。因此搜索没有“搜索”按钮,选择选项时查询开始。

我正在使用KnockoutJS用于UI和Sammy用于路由。搜索选项绑定到observableArray。问题是我不知道在哪里可以设置location.hash。我现在使用的是订阅功能。在KnockoutJS教程中,我看到点击是绑定到设置哈希的函数,但在这里我认为不需要为每个复选框创建一个点击功能,我也相信太多了。

这里是Fiddle

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());
​

1 个答案:

答案 0 :(得分:2)

修复简单有效。我没有使用“订阅”方法,而是添加了 ko.computed 调用,我在其中设置了哈希。

此调用使用“ throttle ”扩展程序进行修饰,因此当更多相关的observable在同一时间进行虚拟更改时,哈希将只设置一次,因此Sammy只会拦截一次该路径,在涉及AJAX请求时保存。

这里是Fiddle