【问题标题】:Converting JSON object to knockout observable not works in IE8, but works in all other browsers将 JSON 对象转换为可淘汰的 observable 不适用于 IE8,但适用于所有其他浏览器
【发布时间】:2013-12-13 06:42:21
【问题描述】:

我有以下对象

{
      "section_name": "Basic Info",
      "data": [
        {
          "jw_fullname": "John",
          "jw_email": "smith@gmail.com",
          "jw_phone": "12365489",
          "jw_website": "www.rcv.com",
          "jw_address1": "Test",
          "jw_address2": "T test",
          "jw_address3": "tesst,",
          "mtheme": "metro",
          "dtheme": "Bold"
        }
      ],
      "key": "basicinfo",
      "prevent": true
    }

我希望它里面的所有东西都应该是可观察的。所以我将“数据”传递到“convertToObservable”函数中,以使其内部的一切都变得可观察。

   function convertToObservable(section)

    {

        var newSection = [];

        $.each(section, function (i, obj) {


            var newObj = {};

            Object.keys(obj).forEach(function (key) {

                console.log(key);

                newObj[key] = ko.observable(obj[key]);

            });

            newSection.push(newObj);

        });

        return newSection;

    }

这使得其中的所有内容都可以观察到,并且在除 IE8 之外的所有浏览器中都能完美运行。

在 IE8 中,函数“convertToObservable”中的这一行失败

Object.keys(obj).forEach(function (key) {

我只在 IE8 中收到此错误“对象不支持此属性或方法”

有没有办法让它在 IE8 中工作?

【问题讨论】:

    标签: javascript jquery knockout.js internet-explorer-8 knockout-mapping-plugin


    【解决方案1】:

    IE8 不支持 Object.keys

    来自MDN的Polyfill

    // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
    if (!Object.keys) {
      Object.keys = (function () {
        'use strict';
        var hasOwnProperty = Object.prototype.hasOwnProperty,
            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
            dontEnums = [
              'toString',
              'toLocaleString',
              'valueOf',
              'hasOwnProperty',
              'isPrototypeOf',
              'propertyIsEnumerable',
              'constructor'
            ],
            dontEnumsLength = dontEnums.length;
    
        return function (obj) {
          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
            throw new TypeError('Object.keys called on non-object');
          }
    
          var result = [], prop, i;
    
          for (prop in obj) {
            if (hasOwnProperty.call(obj, prop)) {
              result.push(prop);
            }
          }
    
          if (hasDontEnumBug) {
            for (i = 0; i < dontEnumsLength; i++) {
              if (hasOwnProperty.call(obj, dontEnums[i])) {
                result.push(dontEnums[i]);
              }
            }
          }
          return result;
        };
      }());
    }
    

    【讨论】:

      【解决方案2】:

      here 所述,Objects.keys 在 IE8 中不可用。一个简单的 for in 循环应该适合您。请务必使用hasOwnProperty 过滤掉原型链中更上层的属性

      for (var key in obj){
          if (obj.hasOwnProperty(key)){
              newObj[key] = ko.observable(obj[key]);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-18
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        相关资源
        最近更新 更多