2

我有一个简单的模型,上面有一个可观察的(“model.thing”)。然后我在这个(“someProp”)上设置了一个额外的可观察对象并将它传递给组件的参数。

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

在这一点上,observable 已经成为一个计算值,我不知道为什么。

如果我更改模型,而不是将其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,他向我指出了这一点,这解释了这一点。

使用自定义元素语法时提供的 params 对象还将包括一个 $raw 属性(除非 params 恰好提供具有相同名称的属性),它可以访问返回原始值(而不是展开的值)的计算。

例如:

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

在这种情况下,由于访问了 selectedItem,因此参数作为计算值提供。当计算被访问时,解包的值被返回以避免必须双解包参数来获取它的值。但是,在这种情况下,您可能希望访问可观察的值,而不是未包装的值。在组件中,这可以通过访问params.$raw.value(). 默认功能倾向于易于使用(不必解开参数两次),同时提供$raw高级案例。

于 2015-02-27T10:52:31.720 回答