【问题标题】:knockoutjs afterAdd and afterRender problemknockoutjs afterAdd 和 afterRender 问题
【发布时间】:2011-11-21 06:23:19
【问题描述】:

我正在使用一个简单的模板,其中包含一个 {{each}} 块。每当集合中的某些内容发生变化时,整个模板都会重新渲染。

然后我在模板绑定中附加了一个 afterRender 事件。调用的函数将简单地将焦点设置到新添加的输入元素。完美运行。

{{each Fabbricati}}
<li>
    <div style="float: left; clear: left;">
        {{if Editing}}
        <input id="editingitem" type="text" data-bind="value: Name, event: { blur: function() { Editing(false) }, keypress: function(event) { if (event.which == 13) { blur() } return true; } }" />
        {{else}}
        <span data-bind="click: function() { Editing(true) }">${Name() || 'Senza nome'}</span>
        {{/if}}
        - <button class="fancybox edit" data-bind="click: function() { Edit(Id()) }">Modifica</button><button class="remove" data-bind="click: Remove">Rimuovi</button>
    </div>
</li>
{{/each}}

和调用 div:

<div id="wrapper" data-bind="template: { name: 'navTemplate', afterRender: Prettify </div>

现在我尝试将 {{each}} 中的块移动到独立模板,并使用模板绑定中的“foreach”选项调用它。到目前为止一切都很好,但这里有一个问题:afterRender 将不再工作。我的输入不会获得焦点。

我已经在互联网上读到它是预期的行为,并改用afterAdd,但这也不起作用。我的Prettify 函数的效果总是添加到除了最后一个添加的元素之外的所有元素。如果我添加另一个,前一个会得到行为,等等。

我真的被困住了。如果有人知道如何解决这个问题,那将是一个救命稻草。

谢谢。

【问题讨论】:

    标签: javascript mvvm knockout.js


    【解决方案1】:

    试试这个:

    来自http://knockoutjs.com/documentation/template-binding.html

    将 {{each}} 与可观察数组一起使用

    使用 {{each someArray}} 时,如果您的值是 observableArray,您必须通过编写 {{each myObservableArray()}} 将底层数组传递给每个>,而不仅仅是 {{each myObservableArray}}。

    那就试试吧:

    {{each Fabbricati()}} 
    

    【讨论】:

    • 看来您根本没有阅读我的帖子。我说使用 {{each}} 语法我一点问题都没有,一切正常。我的问题是模板:{ foreach: Fabbricati } 语法。
    • 好的。那么 {{each}} 和 foreach 的工作方式不同。 {{each}} 将在发生变化时重新渲染整个模板,因此 afterRender 被触发。 foreach 只是删除/添加一个单独的项目并且不重新渲染完整的模板,所以它是有意义的 afterRender 没有被调用。你见过这个例子:knockoutjs.com/examples/animatedTransitions.html 吗?也许你可以试试“afterAdd: function(elem) { // do your stuff here }” 语法。
    • 再一次,如果您阅读了我的整个帖子,我表示我尝试了 afterAdd 没有成功。
    • 那么如果你执行“afterAdd: function(elem) { // do your stuff here }” 那么什么是elem?它是 null 还是添加的最后一个元素? (也请您不要反复说我没有读过您的帖子 - 我读过。我最初可能错过了它的要点,但我只是想在这里提供帮助,如果有一点礼貌,将不胜感激。谢谢。)跨度>
    • 对不起,我不是故意无礼的。使用 JS 时有点沮丧。我会尽快发布有关它的更多详细信息。谢谢。
    【解决方案2】:

    我会尝试在https://github.com/SteveSanderson/knockout/tree/1.3 上查看新版本的 beta 淘汰赛。它有一些不同的方法来进行更简单的绑定,并且可以更好地满足您的需求。 http://blog.stevensanderson.com/2011/08/31/knockout-1-3-0-beta-available/ 有一篇关于新功能的文章。

    我遇到了一些与您遇到的问题类似的问题,但使用了新的控制流绑定能够大大简化我的代码。见下文。

    关于afterRender:

    <ul data-bind="foreach: products, afterRender: callback">
    <li>
        <strong data-bind="text: name"></strong>
        &mdash;
        Last updated: <em data-bind="text: $parent.lastUpdated"></em>
    </li>
    

    这类似于我昨天运行的代码。我发现每次生成一行时都会调用 afterRender。我认为这是您正在寻找的行为。 Knockout 1.3 Beta 注意 - afterRender 和 IE9 从今天开始就有问题,因为它会导致异常。

    【讨论】:

    • 确保您的绑定使用 ibject 来提供 &lt;ul data-bind="foreach: { data: products, afterRender: callback }"&gt; 等选项
    • 克里斯,你拯救了我的一天。这让我一度不知所措,想知道为什么 afterRender 没有更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多