【问题标题】:Dynamic knockout template with transition带过渡的动态剔除模板
【发布时间】:2014-01-23 14:15:53
【问题描述】:

我正在处理一个使用模板绑定呈现的列表。这些项目有一个折叠和展开的视图,这是由单个项目上的可观察属性决定的。这是通过为模板名称提供一个函数来完成的(就像在淘汰赛文档中一样)。到目前为止一切都很好,到目前为止一切都很好。 现在..问题。我想在更改模板时为过渡设置动画。到目前为止,我已经设法为“转换中”(使用 afterRender 事件)设置动画,即在加载新模板时。但我也想在旧模板被删除之前对其进行“Out-transition”。 这就是我现在的距离。 http://jsbin.com/UvEraGO/15/edit?html,js,output

知道如何实现这个“out-transition”吗?

代码如下:

[viewmodel.js]
var vm = {
  items: [{name: 'John', age:'34', expanded: ko.observable(false)},
          {name: 'David', age:'24', expanded: ko.observable(false)},
         {name: 'Graham', age:'14', expanded: ko.observable(false)},
         {name: 'Elly', age:'31', expanded: ko.observable(true)},
         {name: 'Sue', age:'53', expanded: ko.observable(false)},
          {name: 'Peter', age:'19', expanded: ko.observable(false)}]


};

vm.myTransition = function(el){
  $(el[1]).hide().slideDown(1000);
};

vm.templateSelector = function(item){
  return item.expanded() ? 'expanded_template' : 'collapsed_template';
}.bind(vm);

vm.toggleTemplate = function(item){
  item.expanded(!item.expanded());
};

ko.applyBindings(vm);

还有html:

<div data-bind="template: { name: templateSelector, foreach: items, afterRender: myTransition }"></div>

<script type="text/html" id="collapsed_template">
    <div style="min-height: 30px">
        <strong>Name: <span data-bind="text: name"></span></strong>
        <button data-bind="click: $parent.toggleTemplate">Expand</button>
        <div>
</script>

<script type="text/html" id="expanded_template">
    <fieldset style="height: 100px; min-height: 8px">
        <legend>
            <strong>Name: <span data-bind="text: name"></span></strong>
        </legend>
        <div>
            Age: <span data-bind="text: age"></span>
            <button data-bind="click: $parent.toggleTemplate">collapse</button>
        </div>

    </fieldset>
</script>

【问题讨论】:

  • 请编辑您的问题并在问题中包含相关代码(这样可以确保即使链接失效或 jsbin 发生变化,问题仍然相关)。

标签: javascript templates knockout.js


【解决方案1】:

一个想法是创建类似slideTemplate 绑定的东西并在模板中使用它。它看起来像:

ko.bindingHandlers.slideTemplate = {
    init: ko.bindingHandlers.template.init,
    update: function(element, valueAccessor, allBindings, data, context) {
        //ensure that we have a dependency on the name
        var options = ko.unwrap(valueAccessor()),
            name = options && typeof options === "object" ? ko.unwrap(options.name) : name,
            $el = $(element);

        if ($el.html()) {
            $el.slideUp(250, function() {
                ko.bindingHandlers.template.update(element, valueAccessor, allBindings, data, context);

                $el.slideDown(1000);
            });
        }
        else {
            ko.bindingHandlers.template.update(element, valueAccessor, allBindings, data, context);
        }
    }
};

然后,您将绑定如下内容:

<ul data-bind="foreach: items">
    <li  data-bind="slideTemplate: type">
    </li>
</ul>

示例:http://jsfiddle.net/rniemeyer/6J67k/

【讨论】:

  • 非常感谢.. 好简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 2013-09-15
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
相关资源
最近更新 更多