2

私は単純なモデルを持っており、その上に観察可能 (「model.thing」) があります。次に、これに追加のオブザーバブル (「someProp」) を設定し、それをコンポーネントのパラメーターに渡します。

model.thing = ko.observable({});
model.thing.someProp = ko.observable("Yolo");

この時点で、オブザーバブルは計算済みになりましたが、その理由はわかりません。

モデルを変更しmodel.thingて、オブザーバブルとして持つのではなく、単純なオブジェクトとして持ってからそれを渡すと、計算されたオブジェクトに変更せずに通過します...

誰かがこの動作について説明していますか?

これが実際の例です(計算されたことを示すパラメーターに警告します)。

http://liveweave.com/MozLiW

var viewModel = function() {
    var model = {};
	model.thing = ko.observable({}); //when thing is observable
  	//model.thing = {};
	model.thing.someProp = ko.observable("Yolo");
	
    
  return model;
};

ko.components.register('custom-element', {
    viewModel: function(params) {
        this.value = params.value;
      	alert(this.value); //then this is dependent, why?!
    }, 
    template:
  		'<div data-bind="text: value"></div>'
});

ko.applyBindings(viewModel);
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script>

<title>Knockout component</title>
</head>
<body>
  <custom-element params="value: thing().someProp"></custom-element>
<!--   
<custom-element params="value: thing.someProp"></custom-element> -->

</body>
</html>

4

1 に答える 1

1

nemesv のおかげで、彼はそれを説明するthisを教えてくれました。

カスタム要素構文を使用するときに提供される params オブジェクトには、元の値 (ラップされていない値ではなく) を返す計算へのアクセスを提供する $raw プロパティも含まれます (params がたまたま同じ名前のプロパティを提供する場合を除く)。

例えば:

<my-component params="value: selectedItem().value"></my-component>

この場合、selectedItem がアクセスされるため、param は計算されたものとして提供されます。計算された値にアクセスすると、その値を取得するためにパラメーターを二重にアンラップする必要がないように、アンラップされた値が返されます。ただし、この場合、ラップされていない値ではなく、観察可能な値にアクセスしたい場合があります。コンポーネントでは、これは にアクセスすることで実現できますparams.$raw.value()$rawデフォルトの機能は、高度なケースを提供しながら、使いやすさ (パラメーターを 2 回アンラップする必要がない) に傾いています。

于 2015-02-27T10:52:31.720 に答える