2015-08-26 4 views
1

У меня возникла проблема с установкой условия на javascript. В случае формы я использую код ниже. Когда я вводим код материала вручную, все в порядке, но когда я пользуюсь поисковой подсказкой, он дает мне ошибку. Когда я проверяю его на отладчике, я вижу 2 ситуации, основанные на моем методе ввода кода. Можете ли вы помочь мне улучшить код ниже, его работа не работает должным образом. Дает ошибку на шаге if (lookuptextvalue.name_Value.value), если я ввожу код материала с помощью справки по поиску.MSCRM 2011 Проблема с условиями Javascript

function matName() { 
var lookupObject = Xrm.Page.getAttribute("new_material"); 

if (lookupObject != null) 
{ 
    var lookUpObjectValue = lookupObject.getValue(); 
    if ((lookUpObjectValue != null)) 
    { 
    var lookuptextvalue = lookUpObjectValue[0].keyValues; 
    if (lookuptextvalue.name_Value.value) { 
    var lookuptextvaluex = lookUpObjectValue[0].keyValues.name_Value.value; 
    } 
    else if(lookuptextvalue.name.value) { 
    var lookuptextvaluex = lookUpObjectValue[0].keyValues.name.value; 
    } 
    var lookupid = lookUpObjectValue[0].id; 

    Xrm.Page.getAttribute("new_matname").setValue(lookuptextvaluex); 
    } 
    else { 
    Xrm.Page.getAttribute("new_matname").setValue(); 
} 
} 
} 

Thanks Elda.

+0

'lookuptextvalue.name_Value' не существует, но вы пытаетесь найти свойство этого, это вызовет ошибку. Чтобы исправить первую проверку, она существует, тогда проверьте, чтобы значение равнялось true 'if (lookuptextvalue.name_Value && lookuptextvalue.name_Value.value) {' Кстати, вам нужно потратить некоторое время на изучение хорошего стиля макета кода, ваш грязный и плохой стиль будет очень сложно найти ошибки и проблемы, так как ваш код становится более сложным. – Blindman67

+0

@ Blindman67 thakns для вашего совета и решения. Это сработало. Можете ли вы дать мне несколько ссылок для обучения? – Eldanar

+0

Посмотрите на Дугласа Крокфорда, у вас есть семинары и лекции, книги и многое другое. Он создал JSON и JSLint. Его пути могут казаться немного педантичными сначала, но хорошо изучать. Хороший стиль кода очень важен, лично это самая важная часть, чтобы стать хорошим программистом. – Blindman67

ответ

0

Это такая распространенная ошибка, которая вызывает появление новых пользователей в javascript.

if(this.myData.myValue){ ... 
// throws: Uncaught TypeError: Cannot read property 'myValue' of undefined` 

Многие будут смотреть на myValue для этой проблемы, но если вы читаете ошибку тщательно он говорит, что не может найти недвижимость myValue неопределенных. Это не myValue, это вопрос, но myData, который не определен и, следовательно, не может иметь никаких свойств. Я лично хотел бы, чтобы ошибка прочитала Uncaught TypeError: 'myData' is undefined and has no property 'myValue', поскольку это остановило бы так много застрявших там, где проблема.

undefined - особый объект в javascript и размножается повсюду. undefined эквивалентно false. undefined присваивается объекту, который не инициирован. Объекты, которые не были определены, равны undefined. Объект, который имеет значение undefined, не помещается в файлы JSON. undefined не разрешено в файлах JSON, если это не строка. Объект, который имеет значение undefined, не может иметь свойств. undefined - примитивный тип.

Примеры

var myObj; // declare a variable without a value. It automatically gets undefined 
      // you can check if the object has a value 

if(myObj === undefined){ // will be true if myObj has no value 
         // this does not mean it has been declare 

if(myOtherObj === undefined){ // will return true as well even thought myOtherObj has not been declared 

Чтобы проверить, если переменная была объявлена ​​недействительной использование 0

// from above code snippet 
if(myObj === void 0){ // is true because myObj has been declared 

if(myOtherObj === void 0){ // is false because myOtherObj has not been declared. 

Многие люди используют то вырезать, чтобы определить, является ли объект неопределенным. Это может вызвать проблемы, если вы не будете осторожны.

if(!myObj){ // will be true if my object is undefined. 
      // this is bad practice because the Numbers 0, the boolean false, 
      // the Object null are also equivalent to false; 

myObj = 0 
if(!myObj){ // the test intended to find out if myObj has been defined fails 

myObj = false 
if(!myObj){ // again the test fails. 

myObj = null 
if(!myObj){ // again. 

Я всегда настаиваю на том, что люди используют точный оператор эквивалентности === для проверки undefined

if(myObj === undefined){ 

В отличии от C/C++ и других подобных языков порядка условного оператора всегда слева направо. JavaScript выйдет из условного состояния, как только он узнает, что он потерпел неудачу. Это удобно для тестирования для неопределенных

Решение проблемы.

var myObj; 
if(myObj !== undefined && myObj.myProperty){ // this will not crash 
              // because if myObj is undefined 
              // it will exit at the first 
              // condition. 

// on the other hand this will 
if(myObj.myProperty && myObj !== undefined){ // this will throw an error if 
              // myObj is undefined 

undefined эквивалентно некоторых других типов Javascipt

undefined == null // true 
undefined == false // false 
undefined == 0  // false 
undefined === null // false 
undefined === false // false 
undefined === 0  // false 

// be careful as the ! operator changes things a little 
var a = undefined; 
!a //true 
a = 0; 
!a // true 
a = null; 
!a // true 
a = false;  
!a // true 

JSON файлы не имеют неопределенные в качестве значения.

{ 
    "myObj" : undefined 
} 
// this is not a valid JSON file. 

Когда stringifing объект в JSON все объекты, которые имеют значение не определено, не будет добавлен в строку JSON

var myObj = { 
    propA : 0, 
    propB : "hello", 
    propC : undefined, 
    propD : null 
}; 
var str = JSON.stringify(myObj); // will create the JSON string 

{ 
    "propA" : 0, 
    "propB" : "hello", 
    "propD" : null 
} 
// not that propC does not appear in the JSON 

undefined сложный зверь в JavaScript и лучше ознакомиться с его использования.

Узнайте больше на

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

Смежные вопросы