2016-02-26 63 views
3

我得到的錯誤對象是不確定的,當我把它從另一個對象

Uncaught TypeError: Cannot read property 'render' of undefined

它是在第29行,當我調用該函數listView.render()

感謝您的幫助

var model = { 
    // the array with cats names 
    cats: ['mew', 'meo', 'meaw', 'memaw', 'mesaw', 'metaw'], 
    // The array of cats objects 
    Cats: [] 
    } 


var oct = { 
    // selecting the list on the left of the container 
    catsList: function() { 
     return document.querySelector('#catsList'); 
    }, 
    //selecting the cat display div 
    catsDisplay: function() { 
     return document.querySelector('#catsDisplay'); 
    }, 
    // creating the Cat object and push it to the Cats array 
    addCat: (function (arr) { 
     for (var i = 0; i < arr.length; i++) { 
      model.Cats.push((function (n) { 
       return { 
       name: n, 
       photo: n + '.jpg', 
       score: 0 
       }; 
      }(arr[i]))); 
    listView.render(model.Cats[i]); 
     }; 
    }(model.cats)) 
} 

var listView = { 
    render: function (CatObj) { 
     oct.CatList.innerHTML = "<div id='"+CatObj.addCat.name+"'>ss</div>" 
    } 
} 
+0

的'addCat'代碼被包裝在一個IIFE並且因此執行的時候了。這是一個非常糟糕的設計,並且非常出乎意料,也是爲什麼'listView'在那個時候是未定義的。你至少應該有一些像'oct.init()'這樣的東西。你的整個代碼實際上是非常糟糕的海事組織(沒有冒犯性),在各地都有緊密的耦合和隱藏的依賴。例如,爲什麼listView沒有封裝它自己的列表DOM元素......你不必從那裏到達oct。 – plalx

回答

0

listView被吊起並設置爲undefined。所以在這裏 listView.render(model.Cats[i]);listViewundefined

+0

這是真的,但真正的問題是IIFE。 – plalx

0

聲明之前,您不能使用的ListView。試試這個:當你聲明作爲變量

var model = { 
    // the array with cats names 
    cats: ['mew', 'meo', 'meaw', 'memaw', 'mesaw', 'metaw'], 
    // The array of cats objects 
    Cats: [] 
    } 


var listView = { 
    render: function (CatObj) { 
     //oct.CatList.innerHTML = "<div id='"+CatObj.addCat.name+"'>ss</div>" 
    } 
} 


var oct = { 
    // selecting the list on the left of the container 
    catsList: function() { 
     return document.querySelector('#catsList'); 
    }, 
    //selecting the cat display div 
    catsDisplay: function() { 
     return document.querySelector('#catsDisplay'); 
    }, 
    // creating the Cat object and push it to the Cats array 
    addCat: (function (arr) { 
     for (var i = 0; i < arr.length; i++) { 
      model.Cats.push((function (n) { 
       return { 
       name: n, 
       photo: n + '.jpg', 
       score: 0 
       }; 
      }(arr[i]))); 
    listView.render(model.Cats[i]); 
     }; 
    }(model.cats)) 
} 

    var listView = { 
    render: function (CatObj) { 
     oct.CatList.innerHTML = "<div id='"+CatObj.addCat.name+"'>ss</div>" 
    } 
} 
+3

通過這個概念,現在'oct'不會被定義嗎? – Brett

+0

@佈雷特啊,謝謝你,我會改變答案。 –

0

,他們在他們的地方要建立這樣在這種情況下你聲明的ListView你調用它

如果你想ListView控件是後可用,不管它在哪裏更改爲常規功能,例如

function listView() { 

} 

由於函數將在運行時被懸掛到頂部。

0

似乎沒有被一個酒店在oct對象命名爲CatList。你也沒有調用這個函數。嘗試使用oct.CatListoct.catsList,調用函數。也改變Cats_Cats,用返回一個可能被調用的函數替換IIFE

var model = { 
 
    // the array with cats names 
 
    cats: ['mew', 'meo', 'meaw', 'memaw', 'mesaw', 'metaw'], 
 
    // The array of cats objects 
 
    _Cats: [] 
 
} 
 

 
var oct = { 
 
    // selecting the list on the left of the container 
 
    catsList: function() { 
 
    return document.querySelector('#catsList'); 
 
    }, 
 
    //selecting the cat display div 
 
    catsDisplay: function() { 
 
    return document.querySelector('#catsDisplay'); 
 
    }, 
 
    // creating the Cat object and push it to the Cats array 
 
    addCat: (function(arr) { 
 
    return function() { 
 
     for (var i = 0; i < arr.length; i++) { 
 
     model._Cats.push({ 
 
      name: i, 
 
      photo: i + '.jpg', 
 
      score: 0 
 
     }); 
 
     listView.render(model._Cats[i]); 
 
     }; 
 
    } 
 
    }(model.cats)) 
 
} 
 

 
var listView = { 
 
    render: function(CatObj) { 
 
    oct.catsList().innerHTML += "<div id='" + CatObj.name + "'>ss</div>" 
 
    } 
 
} 
 

 
oct.addCat()
<div id="catsList"> 
 

 
</div> 
 

 
<div id="catsDisplay"> 
 

 
</div>

https://jsfiddle.net/8u60bcsv/1/的jsfiddle

相關問題