在viewEngine.js中,durandal IE8“undefined为null或不是对象”错误

时间:2015-07-14 08:18:34

标签: durandal durandal-2.0

我只在IE中收到上述错误。 抛出错误的行显然是

element.setAttribute('data-view', viewId);

在viewEngine.js

createView: function(viewId) {
        var that = this;
        var requirePath = this.convertViewIdToRequirePath(viewId);
        var existing = this.tryGetViewFromCache(requirePath);

        if (existing) {
            return system.defer(function(dfd) {
                dfd.resolve(existing.cloneNode(true));
            }).promise();
        }

        return system.defer(function(dfd) {
            system.acquire(requirePath).then(function(markup) {
                var element = that.processMarkup(markup);
                element.setAttribute('data-view', viewId);
                that.putViewInCache(requirePath, element);
                dfd.resolve(element.cloneNode(true));
            }).fail(function(err) {
                that.createFallbackView(viewId, requirePath, err).then(function(element) {
                    element.setAttribute('data-view', viewId);
                    that.cache[requirePath] = element;
                    dfd.resolve(element.cloneNode(true));
                });
            });
        }).promise();
    },

编辑: 我将其缩小到生命周期中activate()和binding()之间发生的错误。不过,不确定这是否有任何帮助。

edit2:经过进一步调查,我发现processMarkup(标记)没有像它应该的那样返回一个HtmlDivElement,而且通常对所有其他模块都有...

2 个答案:

答案 0 :(得分:1)

看起来IE8的setAttribute方法存在问题。

要解决,请尝试以下方法:

将此作为您的doctype

<!DOCTYPE html>

然后把它放在文件的头部

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

资源链接:Replace setAttribute with IE compatible script

答案 1 :(得分:-1)

我发现了错误,它不是任何JavaScript代码的一部分。 如果提供的html标记具有语法正确的HTML标记,则Durandals viewEngine.js中的$ .parseHTML()函数仅返回一个对象。我忘了在视图的最后关闭一个div,这就是问题所在。