2011-09-16 29 views
1

什么是在Knockout中管理多个触发器的最佳方式。当阵列中的游客人数发生变化或所选组类型发生变化时,下面的相关observable将触发触发器。KnockoutJS - 管理多个触发器

var ajaxTrigger = ko.dependentObservable(function() { 
    this.selectedGroupType(); 
    this.travellers(); 
    alert("triggered"); 
}, viewModel); 

但是我有selectedGroupType订阅,可以改变旅客的数量:我的位置是

viewModel.selectedGroupType.subscribe(function(groupType) { 
    switch(groupType) 
    { 
     case "Individual": 
      // changes traveller quantity to 1 
      break; 
     case "Couple": 
      // changes traveller quantity to 2 
      break; 
     case "Family": 
      // changes traveller quantity to 3 
      break; 
     default: 
      break; 
    } 
}, viewModel); 

所以,如果我做出改变selectedGroupType那么它有可能,我会如果旅行者数量发生变化,可获得第二个触发器

但是我只想在组队类型和旅客数量都决定之后触发一次通话。

最好的方法是什么?

回答

0

我会看看节流。以史蒂夫·桑德森的博客看看第6项:

http://blog.stevensanderson.com/2011/08/31/knockout-1-3-0-beta-available/

// Will not notify changes faster than once per 500ms 
var myObservable = ko.observable("initial value").extend({ throttle: 500 }); 

// Will not re-evaluate *or* notify changes faster than once per 500ms 
var myDependentObservable = ko.dependentObservable(function() { 
    // Evaluation logic goes here, usually referencing other observables 
    return 123; 
}).extend({ throttle: 500 }); 
+0

感谢马克。我会下载最新版本。 – BrightonDev

+0

我试着添加一个1000ms的节流阀,现在只要页面渲染,然后在1秒后再次发出一次Ajax请求。这很奇怪,因为Ajax请求的调用是由依赖的observable创建的,即使我删除了所有对其他observable的引用,AJAX请求仍然被触发:var ajaxTrigger = ko.dependentObservable(function(){ GetPrices(); } ).extend({throttle:1000}); – BrightonDev

+1

我知道这是非常古老的,但是为了帮助任何发生在这个问题上的人,使用ko.dependentObservables(现在称为ko.computed),他们在第一次绑定时得到评估,找出其中的可观察对象。我最终在一个非常相似的情况下做了一个初始化变量,它在viewModel的底部和ko.computed调用中设置为true,我想绑定的observables但是在调用之前检查以确保初始化为true ajax,所以我在初始评估期间不会触发ajax调用。 – MHollis