【问题标题】:Knockoutjs event binding to image load eventKnockoutjs 事件绑定到图像加载事件
【发布时间】:2012-11-20 12:05:28
【问题描述】:

我正在使用 Knockout.js 显示从我的服务器返回的搜索结果列表。结果集中的每个结果都包含一个图像。我正在尝试为每个图像的加载事件附加一个处理程序,以便我可以根据所有图像的最大高度调整图像的父 div 的大小,但加载事件似乎在图像完成加载之前触发。

此外,我可以看到加载处理程序在 firebug 中被命中,但调试行为只是让图像有时间加载,因此在调试时一切正常。

我的 viewModel 中的负载处理程序:这会将已解析的 deferred 推送到我的 Promise 数组中。然后我要做的就是检查以确保数组已满,这将告诉我图像已加载。

self.imageLoadHandler = function() {
    var promise = $.Deferred().resolve;
    promises.push(promise);
};

负载处理程序的绑定

<img data-bind="attr: { src: Posters.Detailed, alt: Title }, event: { load: $root.imageLoadHandler }" />

viewModel 中的搜索功能:这会返回 json 结果,填充我的 observable 数组,然后通过首先检查以确保 promises 数组已满来设置每个“缩略图”的高度,然后如果是,则获取最大高度并将所有“缩略图”设置为该高度。

self.search = function () {
    $.getJSON(arguments[0].action, { name: this.searchValue() }, function (data) {
        self.movies(data);
        setThumbnailHeight();
    });
};

var setThumbnailHeight = function() {
    var $items = $('.thumbnails li');
    $.when.apply($, promises).done(function() {
        var maxHeight = Math.max.apply(null, $items.map(function () {
            return $(this).height();
        }).get());
        $items.css('height', maxHeight);
    });
};

我的问题是:为什么加载事件会在图片加载之前触发?如何让加载事件在适当的时间触发?

更新

我的想法是加载事件可能会过早触发,因为它可能是在图像具有src 之后附加的。如果简单地更改事件绑定的顺序不起作用,我可能必须创建自定义绑定。

【问题讨论】:

    标签: javascript event-handling knockout.js jquery-deferred


    【解决方案1】:

    您只需将event: 数据放在attr: 数据之前即可解决事件绑定问题。

    无论如何(不是双关语),这行是错误的:

    var promise = $.Deferred().resolve;
    

    它创建一个 deferred,然后将 promise 分配为对 resolve 函数的引用,而不调用它。

    当结果数组被传递给 $.when 时,组合的 Promise 会立即解析,因为本身不实现 promise 接口的对象被隐式视为已解析。

    您需要在imageLoadHandler 之外创建延迟对象数组(具有所需长度),然后在此时对适当的延迟对象显式调用.resolve()

    【讨论】:

    • 谢谢Alnitak。直到今晚某个时候我才能对此进行测试,但这听起来可能是我的问题的原因。我会告诉你的:)
    • 是的绑定顺序。我也要去试试。
    猜你喜欢
    • 2021-10-26
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多