gpt4 book ai didi

javascript - 不同 knockout 组件之间的转换

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:46 25 4
gpt4 key购买 nike

我正在尝试应用 CSS 转换,因为我在 knockout 组件之间切换,但我并没有很高兴地实现这一点。本质上,我想要一个固定宽度的 div,但其内部内容会发生变化。当它这样做时,我希望能够转换元素的大小调整。

ko.components.register("big", {
viewModel: function (vm) {
this.items = vm.value.items;
},
template: '<div class="big box" data-bind="foreach: items"><p class="item" data-bind="text: name"></p></div>'
});

ko.components.register("small", {
viewModel: function (vm) {
this.items = vm.value.items;
},
template: '<div class="small box" data-bind="foreach: items"><span class="item" data-bind="text: name"></span></div>'
});






var vm = {};
vm.componentName = ko.observable("small");
vm.items = ko.observableArray([{ name: "A" }, { name: "B" }, { name: "C" }]);
ko.applyBindings(vm);

setInterval(function() {
if(vm.componentName() === "small") { vm.componentName("big"); }
else { vm.componentName("small"); }
}, 3000);
.box {
width: 200px;
-webkit-transition: height 2s;
transition: height 2s;
-webkit-transition: width 2s;
transition: width 2s;
}
.big {
border: thin solid black;
}
.small {
border: thin solid black;
padding: 10px 10px 10px 10px;
}
.item {
padding-left: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div data-bind="component: { name: componentName, params: { value: $data } }">
</div>

所以我问了一些模糊相关的问题 Why doesn't CSS transition get applied?我了解到正在为新值(在本例中为新模板)重新构建 DOM,因此 CSS 转换不适用。

解决方案很简单(确保您重复绑定(bind)到同一事物)。但是对于组件,我真的不想为了获得过渡而将两个模板组合在一起。还有其他方法可以实现吗?

最佳答案

您实际上是在切换组件,这意味着正在重新构建 DOM,所以我看不到使用 CSS 制作动画的方法。

您可以做的是构建您自己的绑定(bind)处理程序,它使用 Javascript 为您制作动画:

ko.bindingHandlers.animatingComponent = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var componentName = value.name;
// create a new observable so we can delay the moment ko's component
// binding builds the new component
var actualComponentName = ko.observable(componentName());
componentName.subscribe(function(newComponent) {
$(element).hide(500, function() {
actualComponentName(newComponent);
$(element).show(500);
});
});

ko.bindingHandlers.component.init(element, function() {
return { name: actualComponentName, params: value.params};
}, allBindings, viewModel, bindingContext);
}
};

ko.components.register("big", {
viewModel: function (vm) {
this.items = vm.value.items;
},
template: '<div class="big box" data-bind="foreach: items"><p class="item" data-bind="text: name"></p></div>'
});

ko.components.register("small", {
viewModel: function (vm) {
this.items = vm.value.items;
},
template: '<div class="small box" data-bind="foreach: items"><span class="item" data-bind="text: name"></span></div>'
});


var vm = {};
vm.componentName = ko.observable("small");
vm.items = ko.observableArray([{ name: "A" }, { name: "B" }, { name: "C" }]);
ko.applyBindings(vm);

setInterval(function() {
if(vm.componentName() === "small") { vm.componentName("big"); }
else { vm.componentName("small"); }
}, 3000);
.box {
width: 200px;
}
.big {
border: thin solid black;
}
.small {
border: thin solid black;
padding: 10px 10px 10px 10px;
}
.item {
padding-left: 10px;
}
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div data-bind="animatingComponent: { name: componentName, params: { value: $data } }">
</div>

关于javascript - 不同 knockout 组件之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com