IE9中的store.find无效

时间:2015-05-22 13:52:39

标签: ember.js ember-data

我似乎无法在Internet Explorer 9中获取新数据。出于示例的目的,我以这种方式测试商店:

get branch -d temp

我收到的唯一错误如下:

App.__container__.lookup('store:main').find('style')

Ember-data是否可以在Internet Explorer 9中开箱即用(没有polyfill,...)?

版本:

  • Ember:1.9.1
  • Ember-data:1.0.0-beta.12

3 个答案:

答案 0 :(得分:2)

问题解决了。使用jQuery执行AJAX请求时,通常会通过XMLHttpRequest对象发生。

在IE8-9上,此对象不存在,而是使用XDomainRequest。最简单的解决方法是添加:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

答案 1 :(得分:0)

ember-data与IE8 +开箱即用。根据{{​​3}}:

  

我们一直在用我们的平台(建立在Ember上)支持IE8   而现在。我知道的事情:

     
      
  • 不需要shim / sham,它由Ember和Ember-Data填充。
  •   
  • 如果您想在函数上添加.bind()之类的其他内容,则需要它,然后必须将其添加到供应商文件中(使用Brocfile)   我们只为此目的包括垫片,而不是假的
  •   

答案 2 :(得分:0)

溶液合成

原因:

在IE8-9上,此对象不存在,而是使用XDomainRequest。

解决方案:

问题解决了。在jQuery中使用AJAX请求时。通常,这是通过XMLHttpRequest对象完成的。一个简单的解决方法是使用开源jQuery-ajaxTransport-XDomainRequest

代码: 添加:

jQuery的ajaxTransport-XDomainRequest.js

/*!
 * jQuery-ajaxTransport-XDomainRequest - v1.0.4 - 2015-03-05
 * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
 * Copyright (c) 2015 Jason Moon (@JSONMOON)
 * Licensed MIT (/blob/master/LICENSE.txt)
 */
(function(factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as anonymous module.
    define(['jquery'], factory);
  } else if (typeof exports === 'object') {
    // CommonJS
    module.exports = factory(require('jquery'));
  } else {
    // Browser globals.
    factory(jQuery);
  }
}(function($) {

// Only continue if we're on IE8/IE9 with jQuery 1.5+ (contains the ajaxTransport function)
if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) {
  return $;
}

var httpRegEx = /^(https?:)?\/\//i;
var getOrPostRegEx = /^get|post$/i;
var sameSchemeRegEx = new RegExp('^(\/\/|' + location.protocol + ')', 'i');

// ajaxTransport exists in jQuery 1.5+
$.ajaxTransport('* text html xml json', function(options, userOptions, jqXHR) {

  // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
  if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) {
    return;
  }

  var xdr = null;

  return {
    send: function(headers, complete) {
      var postData = '';
      var userType = (userOptions.dataType || '').toLowerCase();

      xdr = new XDomainRequest();
      if (/^\d+$/.test(userOptions.timeout)) {
        xdr.timeout = userOptions.timeout;
      }

      xdr.ontimeout = function() {
        complete(500, 'timeout');
      };

      xdr.onload = function() {
        var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
        var status = {
          code: 200,
          message: 'success'
        };
        var responses = {
          text: xdr.responseText
        };
        try {
          if (userType === 'html' || /text\/html/i.test(xdr.contentType)) {
            responses.html = xdr.responseText;
          } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) {
            try {
              responses.json = $.parseJSON(xdr.responseText);
            } catch(e) {
              status.code = 500;
              status.message = 'parseerror';
              //throw 'Invalid JSON: ' + xdr.responseText;
            }
          } else if (userType === 'xml' || (userType !== 'text' && /\/xml/i.test(xdr.contentType))) {
            var doc = new ActiveXObject('Microsoft.XMLDOM');
            doc.async = false;
            try {
              doc.loadXML(xdr.responseText);
            } catch(e) {
              doc = undefined;
            }
            if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
              status.code = 500;
              status.message = 'parseerror';
              throw 'Invalid XML: ' + xdr.responseText;
            }
            responses.xml = doc;
          }
        } catch(parseMessage) {
          throw parseMessage;
        } finally {
          complete(status.code, status.message, responses, allResponseHeaders);
        }
      };

      // set an empty handler for 'onprogress' so requests don't get aborted
      xdr.onprogress = function(){};
      xdr.onerror = function() {
        complete(500, 'error', {
          text: xdr.responseText
        });
      };

      if (userOptions.data) {
        postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data);
      }
      xdr.open(options.type, options.url);
      xdr.send(postData);
    },
    abort: function() {
      if (xdr) {
        xdr.abort();
      }
    }
  };
});

return $;

}));