2016-09-08 6 views
0

を更新しないで、次のモデル:ノックアウト純粋な計算され、観察持つ

var dataModel = ko.observable({ someProp: ko.observable() }); 

    var isValid = ko.pureComputed(function() { 
    return dataModel().isValid; 
    }); 

I以下の機能を持っている:

 function testMe() { 
      dataModel().isValid = false; // This does not work, why? 
      console.log("isValid: " + isValid()); // Doesn't update, shows old value 

      dataModel({ isValid: false }); // This works however I loose all other properties 
      console.log("isValid: " + isValid()); // Prints correctly updated value 

      console.log(ko.toJSON(dataModel()));   
     } 

私はtestMeを実行するたびに()

dataModel.isValid =偽

はconsole.log( "はisValid:" +はisValid())が実行され、それはまだ、なぜ...でも、私は上記のfalseに設定した "真" に設定されています

を? 。私がそれを働かせる唯一の方法は、行うことです。

dataModel({isValid:false}); この方法では、私のモデルでは他のすべてのプロパティが失われます。どうすればこの作品を作れますか?

私は間違っていますか?

+1

は、参照[このjsfiddle](https://jsfiddle.net/8fdyyhr2/:このような何かを試してみてください)、あなたは "[mcve]"を作り、その結果を期待する*理由を説明してください。 – Jeroen

+0

また、(純粋な)計算が、観察不可能な変数に依存する場合、正しく更新されない可能性があります。 – Jeroen

答えて

3

isValidは観測できません。 Observableの1つが変更された場合にのみ、Computedは更新を知っています。あるいは、dataModel.valueHasMutated()を使用して、dataModelが変更されたことをKnockoutに伝えることができます(計算結果が観測可能であるため、計算結果が再計算されます)。

私は可観測性を使用することをお勧めします。私は任意のインスタンスに「真」を参照していないとあなたのコードを実行した場合

var dataModel = ko.observable({ 
 
    someProp: ko.observable(), 
 
    isValid: ko.observable(true) 
 
}); 
 

 
var isValid = ko.pureComputed(function() { 
 
    return dataModel().isValid(); 
 
}); 
 

 
function testMe() { 
 
    console.log("isValid: " + isValid()); 
 
    dataModel().isValid(false); 
 
    console.log("isValid: " + isValid()); 
 

 
    console.log(ko.toJSON(dataModel())); 
 
} 
 

 
testMe();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

+0

お金の上に右。本当にありがとう!。また、質問。なぜ、@ Jeroenのサンプルは、isValidがオブザーバブルではないのに動作しますか? https://jsfiddle.net/8fdyyhr2/ – ShaneKm

+1

@ShaneKm彼の例では、 'isValid'の値は決して変更されません。それは偽に始まり、偽のままです。それが彼の発言だった。 –

+0

私は今それを見る。ありがとう – ShaneKm

関連する問題