图像加载后在 Knockout.js 中淡入容器元素

Posted

技术标签:

【中文标题】图像加载后在 Knockout.js 中淡入容器元素【英文标题】:Fading in container elements in Knockout.js after image has loaded 【发布时间】:2018-06-16 23:00:26 【问题描述】:

我有一个由 Knockout.js 生成的图像和一些文本。文本会立即显示,而图像需要更长的加载时间。

我想在容纳每个图像/文本对的容器上有一个类,当图像完成加载时,然后切换该类并使图像/文本对同时淡入。

我知道有一个 afterRender 回调,我很难编写被调用以定位元素和操作类的函数。

http://jsfiddle.net/ClydeGrey/mfjv5j2c/4/

function SomeModel() 
  this.Firstname = ko.observable();
  this.Lastname = ko.observable();
  this.fadeIn = ko.observable();



function SomeViewModel() 
  var self = this;

  this.ArrayOfModels = ko.mapping.fromJS([]);
  this.dataArray = new Array;

  this.GetModelsByAjax = function() 
    $.ajax(
      type: 'POST',
      url: '/echo/json/',
      data: 
        json: JSON.stringify([
            loaded: false,
            img: "https://source.unsplash.com/random",
            Firstname: "Bob",
            Lastname: "Smith"
          ,
          
            loaded: false,
            img: "https://source.unsplash.com/user/erondu",
            Firstname: "Ted",
            Lastname: "Smith"
          ,

          
            loaded: false,
            img: "https://source.unsplash.com/user/erondu/1600x900",
            Firstname: "Jim",
            Lastname: "Gump"
          
        ]),
        delay: 0
      ,
      context: this,
      success: function(data) 
        for (var x = 0; x < data.length; x++) 
          self.dataArray.push(data[x]);
        
        /* self.dataArray.push(data); */
        console.log(self.dataArray);
        console.log(typeof(self.dataArray));
        console.log(data);
        console.log(typeof(data));
        self.SuccessfullyRetrievedModelsFromAjax(self.dataArray);
      ,
      dataType: 'json'
    );
  ;

  this.SuccessfullyRetrievedModelsFromAjax = function(models) 
    ko.mapping.fromJS(models, self.ArrayOfModels);
  ;


ko.applyBindings(new SomeViewModel());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://rawgit.com/SteveSanderson/knockout.mapping/master/build/output/knockout.mapping-latest.debug.js"></script>
<button data-bind="click: GetModelsByAjax">Go</button>
<div data-bind="template: name: 'model-template', foreach: ArrayOfModels"></div>

<script id="model-template" type="text/html">
  <div data-bind="css:  fadeIn: loaded() === true ">
    <div data-bind="text: Firstname"></div>
    <div data-bind="text: Lastname"></div>
    <img   data-bind="attr:  src: img ">
  </div>
</script>

【问题讨论】:

【参考方案1】:

您已经有一个 loaded 属性,它被初始化为 false 并且是可观察的。我们将通过两种方式使用此属性:

    css 绑定中,将 is-visible 类添加到我们可以设置样式的 img + 标签包装器中 在event 绑定中,设置&lt;img&gt; 标记触发load 事件时的值。

您的新模板,没有任何其他更改:

<div class="Img" data-bind="css:  'is-visible': loaded ">
    <div data-bind="text: Firstname"></div>
    <div data-bind="text: Lastname"></div>
    <img    
          data-bind="attr:  src: img , 
                     event:  load: loaded.bind($data, true) ">
</div>

css 用于淡入淡出,您可以根据自己的喜好更改:

.Img 
  opacity: 0;
  transition: opacity 1s ease-in-out;


.Img.is-visible  opacity: 1; 

在您的小提琴的更新版本中:http://jsfiddle.net/L7cn6y5r/

【讨论】:

以上是关于图像加载后在 Knockout.js 中淡入容器元素的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中淡入异步加载的图像

UIButton 图像从 URL 加载后淡入淡出

knockout js 事件默认加载和数组更新方法

text 加载后淡入图像

加载淡入的图像

当博客加载更多图像时,mouseover 和 mouseout 淡入淡出效果停止