Объект не поддерживает свойство или метод bind как исправить

User1611166769 posted

After updating to visual studio 2013 update 3, I am getting the following runtime error on every page with a formview.  

Unhandled exception at line 65, column 3427 in
http://localhost:53693/9b3609c5e71a4703b362072b60faa99e/browserLink 0x800a01b6 — JavaScript runtime error: Object doesn’t support property or method ‘bind’. 

The debugger points to this line:  

try { this.addExtension(«Microsoft.VisualStudio.Web.BrowserLink.HtmlMappingExtensionFactory», (function(n,t){function k(){var b=this,w=function(n,i){var e,r,u,o;if(!i)return null;if(e=f(i),e)return e.selectorData==n?e:null;if(t(i).is(n.selector)){if(r=null,n.parent){for(u=i.parentElement,o=n.selector.split(«>»).length-1;o>0;o—)u=u.parentElement;s(n.parent,u)&&(r=t(i.parentElement).children(n.selector))}else
n.descendant?t(i).find(n.descendant.selectorData.selector).each(function(i,u){if(s(n.descendant,u))return r=t(u).parents(n.selector),!1}):r=t(n.selector);r&&v(n,r)&&(r.each(function(t,i){if(!p(i)){var u=t%n.elements.length,r=n.elements[u];r&&a(i,r)}}),n.isInTemplateLike||d(n))}return
f(i)},s=function(n,t){return w(n.selectorData,t)==n},nt=function(n){for(var u,r,t=0;t<i.length;t++)if(u=i[t],u&&(r=w(i[t],n),r))return r;return null},e=function(n){var t=f(n);return t?t:nt(n)},l=function(n,t,i){if(n<r.length){var u=r[n];if(u)return{sourcePath:u,startPosition:t,length:i}}return
null},y=function(t,i){t&&(i==null&&(i=!0),n.invoke(«selectRange»,t.sourcePath,t.startPosition,t.length,i))},tt=function(n,t,i){return n.sourcePath.toLowerCase()!=t.toLowerCase()?!1:n.startPosition>i?!1:i-n.startPosition>n.length?!1:!0},g=function(n,t,i){var
r=n.start,f=n.length,o=r+f,e=n.startTag||0,s=r+e,u=t-i;r>=t?u>=o?(r=t,f=0,e=0):u>r?(f=o-u,r=t,e=u>=s?0:s-u):r+=i:s>t?(u>s?e=t-r:e+=i,u>o?f=t-r:f+=i):o>t&&(u>o?f=t-r:f+=i),n.start=r,n.length=f,n.startTag&&(n.startTag=e)},k=function(n,t){for(var
f,e,i,r;t.length>=2;)for(f=t.shift(),e=t.shift(),i=0;i<u.length;i++)r=u[i],r.sourceIndex==n&&g(r,f,e)},c=function(t,i){if(t<r.length){var u=r[t];n.invokeAsync(«getChangesInFile»,u).continueWith(function(n){k(t,n),c(t+1,i)})}else i()};this.getCompleteRange=function(n){var
t=e(n);return t?l(t.sourceIndex,t.start,t.length):null},this.getStartTagRange=function(n){var t=e(n);return t&&t.startTag?l(t.sourceIndex,t.start,t.startTag):null},this.selectCompleteRange=function(n){y(b.getCompleteRange(n))},this.selectStartTagRange=function(n){y(b.getStartTagRange(n))},this.canMapToSource=function(n){return
e(n)!=null},this.ensureUpToDateAsync=function(n){n&&h.push(n),o||(o=!0,c(0,function(){var t=h,n;for(h=[],o=!1,n=0;n<t.length;n++)try{t[n]()}catch(i){}}))},this.getElementAtPosition=function(n,i){for(var f=null,o=null,r,e=0;e<u.length;e++)r=u[e],r.start<=i&&r.length>=i-r.start&&(f==null||f.length>r.length)&&(f=r);return
f&&t(f.selectorData.selector).each(function(n,t){if(s(f,t))return o=t,!1}),o}}var l=!1,r=[],o=!0,h=[],u=[],i=[],f=function(n){return n?n.__browserLink_sourceMapping||null:null},p=function(n){return f(n)!=null},a=function(n,t){n&&(n.__browserLink_sourceMapping=t)},v=function(n,t){return
n.isTemplateLike||n.isParentTemplateLike?t.length%n.elements.length==0:t.length==n.elements.length},c=function(n){var r,o,e,t,f,h,u,s;for(i.push(n),r=i.length-1;r<i.length;r++)for(o=i[r],e=0;e<o.elements.length;e++)if(t=o.elements[e],t){for(f=0;f<t.children.length;f++)h=t.children[f],i.push(h);for(u=0;u<t.ancestors.length;u++)s=t.ancestors[u],i.push(s)}},d=function(n){for(var
t=0;t<i.length;t++)i[t]==n&&(i[t]=null)},nt=function(n){return t(n)},g=function(n,i){for(var u=t(n),f=i.split(«>»),r=0;r<f.length;r++)u=u.children(f[r]);return u},b=function(n,i){return t(n).parents(i)},y=function(n,t){var i=t(n.selector);v(n,i)?(i.each(function(t,i){var
o=t%n.elements.length,r=n.elements[o],u,f;r!=null&&(a(i,r),u=r.children,e(u,0,u.length,null,g.bind(null,i)),f=r.ancestors,e(f,0,f.length,null,b.bind(null,i)))}),n.isTemplateLike&&c(n)):c(n)},e=function(n,t,i,r,u){for(var f=t;f<t+i;f++){if(f>=n.length){r&&r();return}y(n[f],u)}t+i<n.length&&setTimeout(function(){e(n,t+i,i,r,u)},5)},w=function(n,t){e(n,0,10,t,nt)},s=function(n){var
v=[],l,o,i,a,e,t,f,h,r,c;if(n)for(l=0;l<n.length;l++)for(o=n[l],i={selector:o[0],elements:[],isTemplateLike:!1},v.push(i),a=1;a<o.length;a++){if(e=o[a],t=null,e){for(f=e[0],h=e.length>=2?e[1]:{},t={selectorData:i,sourceIndex:f[0],start:f[1],length:f[2],startTag:f.length>=4?f[3]:null,children:s(h.children),ancestors:s(h.ancestors)},h.templateLike&&o.length==2&&(i.isTemplateLike=!0,i.isInTemplateLike=!0),r=0;r<t.children.length;r++)t.children[r].parent=t,t.children[r].isParentTemplateLike=i.isTemplateLike,t.children[r].isInTemplateLike=i.isInTemplateLike;for(c=0;c<t.ancestors.length;c++)t.ancestors[c].descendant=t;u.push(t)}i.elements.push(t)}return
v};return n.addSharedService(«sourceMapping»,new k),{onConnected:function(){if(!l&&n.initializationData&&n.initializationData.requestId){var i=»~/__browserLink/requestData/»+n.initializationData.requestId;n.invokeAsync(«resolveUrl»,i).continueWith(function(i){i&&t.ajax(i,{dataType:»json»,data:{version:2},cache:!0,success:function(t){l=!0;var
i=s(t.map);w(i,function(){n.invokeAsync(«resolveSourceFilePaths»,t.files).continueWith(function(t){r=t,o=!1,n.sourceMapping.ensureUpToDateAsync(null)})})}})})}}}})); } catch(e) { this.log(«Invalid extension script encountered for extension ‘Microsoft.VisualStudio.Web.BrowserLink.HtmlMappingExtensionFactory’.»);
return; }

I can ignore the error and the formview appears to work.

Что это this.model? Как вы создаете эту точку зрения? Я предполагаю, что this.model не то, что должно быть. В представлении свойство model должно быть образцовым экземпляром, и вы должны сказать такие вещи, как:

var m = new Model;
var v = new View({ model: m });

Экземпляр модели будет иметь метод bind (AKA on), но в браузере, не относящемся к камню, так будет функция:

Метод bind() создает новую функцию, которая при вызове имеет это ключевое слово, установленное на предоставленное значение, с заданной последовательностью аргументов, предшествующей любому, предоставленному при вызове новой функции.

Модель «класс»:

var M = Backbone.Model.extend({ ... });

является функцией (как и все, что вы можете назвать new в JavaScript). Это означает, что вы можете так говорить в новых браузерах:

var M = Backbone.Model.extend({ ... });
var v = new View({ model: M });

и this.model.bind('change', this.render) будет выполняться внутри View, он не будет вызывать bind вы ищете, но он вызовет bind, он вызовет Function.bind.

Начните передачу экземпляра модели на ваш взгляд, и все должно стать более разумным.

Уточнение: если вы проверите раздел совместимости браузера MDN на Function.bind, вы увидите, что bind для функций в IE до IE9 отсутствует. Таким образом, Chrome, Firefox и IE9 поддерживают функцию bind вызовов к функциям, но IE8 этого не делает; это точно соответствует наблюдаемому поведению.

Что такое this.model? Как вы воплощаете эту точку зрения? Я предполагаю, что this.model это не то, что должно быть. В представлении, model свойство должно быть экземпляром модели, и вы должны сказать что-то вроде:

var m = new Model;
var v = new View({ model: m });

Экземпляр модели будет иметь bind метод (ака on), но в браузере не каменного века, так будет и функция:

bind() Метод создает новую функцию, для которой при вызове ей присваивается ключевое слово this с заданным значением, причем заданная последовательность аргументов предшествует предоставленным при вызове новой функции.

Модель «класс»:

var M = Backbone.Model.extend({ ... });

это функция (как и все, что вы можете вызвать new в JavaScript). Это означает, что вы можете говорить такие вещи в новых браузерах:

var M = Backbone.Model.extend({ ... });
var v = new View({ model: M });

а также this.model.bind('change', this.render) будет выполнять внутри View, это не будет называть bind вы ищете, но это будет называть bind позвонит Function.bind,

Начните передавать экземпляр модели вашему представлению, и все станет более понятным.


Пояснение: если вы проверите раздел совместимости браузера MDN на Function.bind вы увидите что нет bind для функций в IE до IE9. Таким образом, Chrome, Firefox и IE9 поддерживают вызовы bind на функции, но IE8 нет; это точно соответствует наблюдаемому поведению.

Следующий код работает во всех браузерах, кроме IE. Я получаю сообщение об ошибке «объект не поддерживает свойство или метод ‘bind'».

var FilteredArray = (gAssessorsInfoArray.filter(ApplyFilters.bind(GetFilters(gServiceInfoArray[0].ServiceName, $("#YearsOfExperienceDropDown").val(), $("#P104DropDown").val(), GeographicalLocationArray, SubSpecialtiesArray, LanguagesSpokenArray))));                                   

Мой HTML включает:

<script src="/files/404048/f93304/jquery-1.7.2.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script src="/files/404048/f96289/jquery.multiselect.js"></script>
<script src="/files/404048/f96289/jquery.multiselect.filter.js"></script>
<script src="/files/404048/f96289/prettify.js"></script>
<script src="/files/404048/94413/jquery.tipTip.js"></script>
<script src="/files/404048/94414/jquery.tipTip.minified.js"></script>

Моя функция ApplyFilters:

function ApplyFilters(Item) {           
    var i;

    for(var i = 0; i < this.length; i += 1)
    {   
        if(!this[i](Item))
            return false;               
    }

    return true;            
}

function GetFilters(ServiceName, YearsOfExperience, P104, GeographicalLocation, SubSpecialties, LanguagesSpoken) {
    var Filters = [];

    if (ServiceName) {
        Filters.push(function (Item) {
            return (Item.AvailableForRegular.indexOf(ServiceName) > -1 || Item.AvailableForCAT.indexOf(ServiceName) > -1);
        });
    }

    if (YearsOfExperience != '') {
        Filters.push(function (Item) {
            return Item.YearsOfExperience === YearsOfExperience;
        });
    }

    if (P104 != '') {
        Filters.push(function (Item) {
            return Item.P104 === P104;
        });
    }

    if (GeographicalLocation != '') {
        Filters.push(function (Item) {
            var FoundCounter = 0;                                                    

            for (var i = 0; i < GeographicalLocation.length; i++) {
                if (Item.GeographicalLocation.indexOf(GeographicalLocation[i]) > -1)                                            
                    FoundCounter++;
            }

            if(GeographicalLocation.length == FoundCounter)                
                return true;
            else
                return false;
        });
    }

    if (SubSpecialties != '') {
        Filters.push(function (Item) {
            var FoundCounter = 0;

            for (var i = 0; i < SubSpecialties.length; i++) {
                if(Item.SubSpecialties.indexOf(SubSpecialties[i]) > -1)
                    FoundCounter++;
            }

            if (SubSpecialties.length == FoundCounter)                
                return true;
            else
                return false;
        });
    }

    if(LanguagesSpoken != '') {
        Filters.push(function (Item) {
            var FoundCounter = 0;

            for (var i = 0; i < LanguagesSpoken.length; i++) {
                if (Item.LanguagesSpoken.indexOf(LanguagesSpoken[i]) > -1)                                            
                    FoundCounter++;
            }

            if (LanguagesSpoken.length == FoundCounter)
                return true;
            else
                return false;
        });
    }

    return Filters;
}

Проблема

Я пытаюсь заставить мой проект Aurelia работать в Internet Explorer 11, однако получаю следующее сообщение:

Объект не поддерживает свойство или метод ‘bind’ (app.bundle.js 188,11)

Правило, которое вызывает эту ошибку:

    var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);

Эта проблема возникает, когда я пытаюсь связать свое приложение, создав его с помощью:

    au build --env dev

Что я пробовал

Я провел некоторое исследование и обнаружил, что у большего количества людей были подобные проблемы, но не очень с точно таким же, как у меня. Кроме того, я увидел, что Polyfill может решить пару из этих проблем, но в их документации я ничего не видел о bind.

Буду признателен за любую помощь и не стесняйтесь обращаться за дополнительной информацией!

2 ответа

Лучший ответ

bind поддерживается < от IE начиная с IE 9. Может быть, вы вызвали другие режимы IE, чем IE 11.

Вы можете попытаться добавить <meta http-equiv="X-UA-Compatible" content="IE=edge"> в раздел <head> html. Я также обнаружил две похожие темы, на которые вы могли бы ссылаться: тема 1, тема 2.

Если проблема не устранена, вы можете предоставить минимальный пример кода для воспроизведения проблемы.


0

Yu Zhou
22 Апр 2020 в 05:52

Проблема возникла из-за того, что в Internet Explorer 11 было включено представление совместимости по умолчанию. Чтобы игнорировать это, вы можете добавить метатег, который опубликовал Ю Чжоу, это должен быть мета-тег FIRST в разделе head:

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


0

zerk
22 Апр 2020 в 12:49

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как он ее нашел я в шоке
  • Фоллаут 1 как найти веревку
  • Как исправить пенопластовый потолок
  • Как найти интервальную оценку математического ожидания
  • Скачать песню как найти свою подругу

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии