【问题标题】:Uncaught: You can't call rerender on a view being destroyed未捕获:您不能在被销毁的视图上调用重新渲染
【发布时间】:2013-07-02 07:45:39
【问题描述】:

当我在我的应用中导航时,我经常会收到这个错误,这会进一步破坏我应用中的所有导航,我必须重新加载整个页面:

Uncaught You can't call rerender on a view being destroyed

我和 Ember IRC 频道的几个男孩找出了导致问题的原因。

我使用的是来自https://github.com/emberjs/group-helper 的组助手。整个应用程序都设置为使用它,如果我删除它,很多东西都会中断,因为很多变形标签又开始被创建。

知道如何修改帮助程序以消除错误吗?

var get = Ember.get, set = Ember.set, EmberHandlebars = Ember.Handlebars;

EmberHandlebars.registerHelper('group', function(options) {
    var data = options.data,
        fn   = options.fn,
        view = data.view,
        childView;

    childView = view.createChildView(Ember._MetamorphView, {
        context: get(view, 'context'),
        template: function(context, options) {
            options.data.insideGroup = true;
            return fn(context, options);
        }
    });

    view.appendChild(childView);
});

更新:以下内容已过时,仅存在于原始帖子中

在我的应用程序中,我有这三个子类,我的所有视图、数组控制器和路由都基于它们。

查看:

PageView = Ember.View.extend({
    title: '',
    identifier: '',
    classNames: ['page'],
    willDestroyElement: function () {
        var elm_classes = this.$().attr('class') + ' out',
            elm_height = this.$().height(),
            temporary_container = $('<div class="'+elm_classes+'">');

        this.$().children().appendTo(temporary_container);

        temporary_container.insertAfter(this.$());

        window.setTimeout(function() {
            temporary_container.remove();
        }, animationKillDuration);
    },
    didInsertElement: function() {
        $(document).trigger('royalbeer-page-rendered');
    }
});

阵列控制器

RoyalArrayController = Ember.ArrayController.extend({
    goto: function(route, slug) {
        if (!slug)
            this.transitionToRoute(route);
        else
            this.transitionToRoute(route, slug);
    }
});

路线:

RoyalRoute = Ember.Route.extend({
    setupController: function(controller, model) {
        var modelName = this.routeName.substr(0, 1).toUpperCase() + this.routeName.substr(1),
            slug = model;
        if (model.hasOwnProperty('slug'))
            slug = model.slug;
        controller.set('model', App[modelName].find({'slug': slug}));
    },
    serialize: function(slug, params) {
        var name, object;
        object = {};
        name = params[0];
        object[name] = slug;
        return object;
    }
});

我使用数组控制器中的 goto 函数来绑定我的应用程序中的元素以使用 {{action goto 'routename' slug}} 进行导航,并且我的路由上的序列化程序和 setupController 设置为能够处理该问题,这在错误发生之前可以正常工作.

而我只能猜测是因为那些东西才坏的。

关于发生了什么以及如何解决它的任何想法?

【问题讨论】:

  • 我更新了帖子,因为我针对问题的真正原因。我已经添加了导致错误的确切代码。
  • 感谢您发布此信息!我有同样的错误,删除组助手也修复了它。我还没有进一步研究原因。我也可能会离开小组助手。

标签: ember.js navigation ember-data uncaught-exception


【解决方案1】:

我现在已经解决了这个问题,方法是一起删除 group helper 并将我所有的 css 从使用 :first-child/:last-child 重写为 :first-of-type/:last-of-type。包括 Twitter 引导程序。有用。但我真的很想有一种方法让 Ember 不会让我的 DOM 用一般的变形标签膨胀。

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多