错误:对象不支持属性或方法'时刻'

时间:2017-05-20 19:32:31

标签: javascript momentjs

我在Windows 10笔记本电脑上使用Visual Studio 2017社区,并从此处使用Contoso University示例程序:Contoso tutorial

我添加了自己的控制器和视图,以使用适用于jQuery的DataTables Table插件显示具有日期的电子邮件。我正在尝试使用日期时间助手显示日期:datetime helper

一切正常并且显示正常,直到我尝试在这段Javascript中格式化EmailDate:

var detailsTableOpt = {
  'serverSide': true,
  'processing': true,
  'ajax': {
    'url': '/Mailbox/GetEmailsData',
    'data': function(d) {
      d.MailboxID = selected;
    }
  },
  'destroy': true,
  'columns': [{
      'data': 'From'
    },
    {
      'data': 'To'
    },
    {
      'data': 'Subject'
    },
    {
      'data': 'EmailDate',
      columnDefs: [{
        targets: 3,
        render: $.fn.dataTable.render.moment('YYYY/MM/DD', 'Do MMM YY')
      }]
    },
    {
      'data': 'Size',
      render: $.fn.dataTable.render.number(',', '.', 0)
    }
  ]
};

它给出错误“对象不支持属性或方法'时刻'”。

我通过执行此包管理器命令“Install-Package Moment.js”安装了moment.js 2.18.2。它在我的MVC项目的Scripts文件夹中安装了moment.js脚本。

我也把它放在App_Start \ BundleConfig.cs文件中(第一个添加已经存在):

       bundles.Add(new StyleBundle("~/Content/datatables").Include(
                 "~/Content/DataTables/css/dataTables.bootstrap.css"));

       bundles.Add(new ScriptBundle("~/bundles/moment").Include(
                   "~/Scripts/moment.js"));

我在一些文章中读到,我应该试着弄清楚是否有加载的moment.js插件,但我不知道该怎么做。

有人可以解释如何判断moment.js是否被加载?

我在IE 11中调试时出现此错误。当我在Firefox中尝试时,它不会出错,但程序无法正常运行。

在完成开始使用它的所有步骤后,是否有人知道如何解决此问题?

感谢任何帮助。

谢谢, 贝

2 个答案:

答案 0 :(得分:1)

您需要加载datatables momentjs插件的代码才能工作。

example中的链接CDN和项目链接实际上已被破坏,但幸运的是,它包含了我将在此处粘贴的实际代码本身(我没有编写此代码)

// UMD
(function( factory ) {
    "use strict";
 
    if ( typeof define === 'function' && define.amd ) {
        // AMD
        define( ['jquery'], function ( $ ) {
            return factory( $, window, document );
        } );
    }
    else if ( typeof exports === 'object' ) {
        // CommonJS
        module.exports = function (root, $) {
            if ( ! root ) {
                root = window;
            }
 
            if ( ! $ ) {
                $ = typeof window !== 'undefined' ?
                    require('jquery') :
                    require('jquery')( root );
            }
 
            return factory( $, root, root.document );
        };
    }
    else {
        // Browser
        factory( jQuery, window, document );
    }
}
(function( $, window, document ) {
 
 
$.fn.dataTable.render.moment = function ( from, to, locale ) {
    // Argument shifting
    if ( arguments.length === 1 ) {
        locale = 'en';
        to = from;
        from = 'YYYY-MM-DD';
    }
    else if ( arguments.length === 2 ) {
        locale = 'en';
    }
 
    return function ( d, type, row ) {
        var m = window.moment( d, from, locale, true );
 
        // Order and type get a number value from Moment, everything else
        // sees the rendered value
        return m.format( type === 'sort' || type === 'type' ? 'x' : to );
    };
};
 
 
}));

将该代码添加到JavaScript文件中,并在 momentjs和datatables之后将其包含在包中。

答案 1 :(得分:0)

我将Aluan Haddad建议的插件代码添加到名为 momentPlugin.js 的文件中,并将其放在我项目的Scripts文件夹中。

我将这些行添加到 App_Start \ BundleConfig.cs 文件的末尾:

           bundles.Add(new ScriptBundle("~/bundles/momentPlugin").Include(
                       "~/Scripts/momentPlugin.js"));

           bundles.Add(new ScriptBundle("~/bundles/moment").Include(
                       "~/Scripts/moment.js"));

我将这些行添加到 _Layout.cshtml 文件的末尾:

@Scripts.Render("~/bundles/momentPlugin")
@Scripts.Render("~/bundles/moment")

这使我能够在不收到错误的情况下运行应用程序。