Knockout.js 淘汰未更新的自定义组件

Knockout.js 淘汰未更新的自定义组件,knockout.js,Knockout.js,我有一个自定义组件,它使用函数传递参数。在这种情况下,可观察值($data)没有改变,但函数使用了另一个可观察值(正在改变)和一个哈希表(正在改变,但不能被改变) 当我使用以下语法时,显示会更新: <span style="width: 50px; position: absolute; left: 1100px;text-align:center" data-bind="component: {name: ''rotate'', params: {values: Help

我有一个自定义组件,它使用函数传递参数。在这种情况下,可观察值($data)没有改变,但函数使用了另一个可观察值(正在改变)和一个哈希表(正在改变,但不能被改变)

当我使用以下语法时,显示会更新:

        <span style="width: 50px; position: absolute; left: 1100px;text-align:center" data-bind="component: {name: ''rotate'', params: {values: Helper.GetWeatherByFlight($data, ''Hi'')}}"></span>
        <rotate style="width: 50px; position: absolute; left: 1100px;text-align:center" params="{values: Helper.GetWeatherByFlight($data, ''Hi'')}"></rotate>

但当我使用以下语法时,它不会更新:

        <span style="width: 50px; position: absolute; left: 1100px;text-align:center" data-bind="component: {name: ''rotate'', params: {values: Helper.GetWeatherByFlight($data, ''Hi'')}}"></span>
        <rotate style="width: 50px; position: absolute; left: 1100px;text-align:center" params="{values: Helper.GetWeatherByFlight($data, ''Hi'')}"></rotate>

这是一个组件:

ko.components.register('rotate', {
    viewModel: function (params) {
        var values = [];
        var inputValues = ko.isObservable(params.values) ? params.values() : params.values;
        var length = inputValues.length;
        this.MyClass = length > 1 ? "fade-effect" : "";
        if (length >= 1) {
            var index = m_counter % length;
            $.each(inputValues, function (i, value) {
                var opacity = (index == i) ? 1 : 0;
                values.push({ value: value, opacity: opacity });
            });
        }
        this.values = values;
    },
    template: '<span style="position:relative;" data-bind="foreach: values, attr: { class: MyClass }">\
                    <span style="left:0px;top:0px;position:absolute;width:100%;height:100%;" data-bind="text: Helper.GetValue(value, $element), style: {opacity: opacity}"></span>\
                </span>'
});
ko.components.register('rotate'){
viewModel:函数(参数){
var值=[];
var inputValues=ko.isObservable(params.values)?params.values():params.values;
变量长度=inputValues.length;
this.MyClass=长度>1?“淡入淡出效果”:“;
如果(长度>=1){
var指数=m_计数器%长度;
$.each(输入值,函数(i,值){
变量不透明度=(指数==i)?1:0;
push({value:value,opacity:opacity});
});
}
这个值=值;
},
模板:'\
\
'
});

我希望能够使用第二种格式,但目前我只能使用第一种格式。我是否可以更改组件中的某些内容,或者组件的调用方式,以便正确更新这两种格式?我意识到这是一种有点非常规的用法。

在第一种情况下,组件刷新的唯一原因是组件绑定正在查找更改,然后在检测到任何更改时重新初始化整个组件

“旋转组件”本身并没有将您的参数视为可观察的,它只是查看未包装的值,因此没有任何信息告诉它刷新其视图。您需要重写组件视图模型,以使用可观察和计算属性,以便它能够对数据中的更改作出反应

大概是这样的:

viewModel: function (params) {
    var self = this;
    this.inputValues = params.values; //preserve the observable instead of unwrapping its values
    this.MyClass = ko.observable("");

    //values is a computed property so that it updates when the dependent observable (inputValues) is modified.
    this.values = ko.computed(function(){
        var values = [];
        //use ko.unwrap to safely handle either case of inputValues being an observable or non-observable.
        var length = ko.unwrap(self.inputValues).length;
        self.MyClass(length > 1 ? "fade-effect" : "");
        if (length >= 1) {
            var index = m_counter % length;
            $.each(ko.unwrap(self.inputValues), function (i, value) {
                var opacity = (index == i) ? 1 : 0;
                values.push({ value: value, opacity: opacity });
            });
        }
        return values;
    });
},

自定义命名组件元素在params=”“属性中不需要大括号。它只是逗号分隔的值,就像在常规的旧数据绑定“”中一样。params=“values:Helper.GetWeatherByFlight($data,'Hi')”应该足够了。