2013-11-10 74 views
4

我正在使用knockoutjs,我對此很陌生。我想根據下拉列表選擇的值更改模型數據。所以在我的AppModel中,我正在訂閱我想要更改的數組。但它不工作?這裏是我的代碼:knockoutjs訂閱不工作?

var filteredStocks = []; 
function viewModel(model) { 
     this.isGeneral = ko.observable(model.generalStockEnabled); 
     this.stocks = ko.observable();; 
     if (model.generalStockEnabled === true) 
     { 
      filteredStocks = $.grep(model.stocks, function (v) { 
       return v.sourceID === -1; 
      }); 
     } 
     else 
     { 
      filteredStocks = $.grep(model.stocks, function (v) { 
       return v.sourceID !== -1; 
      }); 
     } 
     // If drop downlist changed 
     var dropDownListSelectedValue = $('#enableGeneratInventorydl :selected').val(); 
     this.stocks.subscribe(function() { 
      if (dropDownListSelectedValue === "True") { 
       filteredStocks = $.grep(model.stocks, function (v) { 
        return v.sourceID === -1; 
       }); 
       this.stocks(filteredStocks) 
       this.isGeneral(true); 
      } 
      else 
      { 
       filteredStocks = $.grep(model.stocks, function (v) { 
        return v.sourceID !== -1; 
       }); 
       this.stocks(filteredStocks) 
       this.isGeneral(false); 
      } 
     }, this); 

     this.stocks = ko.observableArray(filteredStocks); 

當我改變下拉列表的值。股票價值保持不變?

任何幫助表示讚賞。

回答

9

出現此問題的原因是您將stocks變量重新分配給另一個observable。 所以你第一次做:

this.stocks = ko.observable(); 

然後訂閱這個觀察。但後來你這樣做:

this.stocks = ko.observableArray(filteredStocks); 

這使stocks與另一個可觀察。訂閱將用於原始觀察,即第一次分配。 較短例子來看看這個小提琴:http://jsfiddle.net/9nGQ9/2/

解決辦法是更換this.stocks = ko.observable();

this.stocks = ko.observableArray();

而更換this.stocks = ko.observableArray(filteredStocks);

this.stocks(filteredStocks);

+0

非常感謝您的回答。它爲我工作。 – user123456

+0

救了我的日子:-D – chris