2016-02-05 20 views
0

我想一個<select>綁定到ko.observableArray和我收到此錯誤:無法處理的結合,國家沒有規定

Uncaught ReferenceError: Unable to process binding "options: function (){return _countries }" Message: country is not defined

這裏是我的代碼。

HTML:

<!-- This is the home page --> 

<html> 

<head> 
    <title>The Vegan Repository</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <!-- Load libraries --> 



    <!-- System.js --> 
    <script 
     src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.18.4/system-csp-production.js"> 
    </script> 

    <!-- JQuery --> 
    <script 
     src="bower_components/jquery/dist/jquery.min.js"> 
    </script> 

    <!-- Bootstrap CSS --> 
    <link 
     rel="stylesheet" 
     href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" 
     integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" 
     crossorigin="anonymous"> 

    <!-- Bootstrap JS --> 
    <script 
     src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" 
     integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" 
     crossorigin="anonymous"> 
    </script> 

    <!-- Knockout JS --> 
    <script 
     src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"> 
    </script> 

    <!-- Styles --> 
    <link rel="stylesheet" type="text/css" href="styles/image.css"> 
    <link rel="stylesheet" type="text/css" href="styles/text.css"> 
    <link rel="stylesheet" type="text/css" href="styles/header.css"> 
    <link rel="stylesheet" type="text/css" href="styles/form.css"> 
    <link rel="stylesheet" type="text/css" href="styles/select.css"> 

    <!-- Google Maps API --> 
    <!-- <script src="http://maps.googleapis.com/maps/api/js"></script> 
    <script src="scripts/map.js"></script> --> 
    <script src="scripts/scroll_to_anchor.js"></script> 
    <script src="scripts/xml2json.min.js"></script> 
    <script src="scripts/country.js"></script> 

</head> 
<body > 
    <div style="margin-bottom: 100px;" class="full_size dimmed"> 
     <div style="position:fixed; z-index: -1;"> 
     <video 
      style="position:fixed;" 
      autoplay loop muted 
      poster="assets/images/home_page/polina.jpg" 
      id="bgvid"> 
      <!--<source src="polina.webm" type="video/webm">--> 
      <source src="assets/videos/polina.mp4" type="video/mp4"> 
     </video> 
     </div> 

     <div class="header dim"> 
      <a href="http://www.w3schools.com" ><h5 id="app-name" class="nav-item clickable white-text medium-text left-text">THE VEGAN REPOSITORY</h5></a> 
      <a href="http://www.w3schools.com" ><h5 (click)="clicked()" id="sign-in-button" class="nav-item clickable brand-colour-text medium-text right-text with-border">SIGN UP FREE</h5></a> 
      <a href="http://www.w3schools.com" ><h5 class="nav-item clickable white-text medium-text right-text">LOGIN</h5></a> 
      <a href="#home_page_footer" ><h5 class="nav-item clickable white-text medium-text right-text" >BLOG</h5></a> 
      <a href="#home_page_footer" ><h5 class="nav-item clickable white-text medium-text right-text" >ABOUT</h5></a> 

     </div> 

     <div id="motto-text" class="vertical-center"> 
      <h5 class="white-text medium-text">THE VEGAN REPOSITORY</h5> 
      <h1 id="main-text" class=" text-center white-text light-text extra-large-text">FIND VEGAN PRODUCTS NEAR YOU</h1> 
      <a id="try-now-button" class="with-border clickable" href="#find-vegan-products-page" ><h5 class=" text-center medium-text">TRY NOW</h5></a> 
     </div> 
    </div> 
    <!--[if lt IE 9]> 
    <script> 
     document.createElement('video'); 
    </script> 
    <![endif]--> 

    <?php 
     $host = 'localhost'; 
     $port = 8889; 
     $servername = "$host:$port"; 
     $username = "root"; 
     $password = "root"; 
     $db = "myDB"; 

     // Create connection 
     $conn = new mysqli($servername, $username, $password, $db); 
     // Check connection 
     if ($conn->connect_error) { 
      die("Connection failed: " . $conn->connect_error); 
     } 

     // Create database 
     /*$sql = "CREATE DATABASE myDB";*/ 

     // Create table 
     /*$sql = "CREATE TABLE Persons 
       ( PersonID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        LastName varchar(255), 
        FirstName varchar(255), 
        Address varchar(255), 
        City varchar(255) 
       );";*/ 

     // Insert row into table 
     $sql = "INSERT INTO Persons (Firstname, Lastname, Address, City) 
       VALUES ('John', 'Doe', '44 Vulcan Lane', 'Auckland'), 
         ('Jane', 'Doe', '44 Vulcan Lane', 'Auckland'), 
         ('Becky', 'Smith', '5 Freemans Lane', 'Kaitaia'), 
         ('Chris', 'Johnson', '18 Snow Drive', 'Christchurch'); 
       "; 

     // Delete all rows 
     /*$sql = "DELETE FROM Persons";*/ 


     /*if ($conn->query($sql) === TRUE) { 
      echo "Database created successfully"; 
     } else { 
      echo "Error creating database: " . $conn->error; 
     }*/ 

     $conn->close(); 
    ?> 

    <!-- <div id="googleMap" style="height:500px;"></div> --> 

    <div id="find-vegan-products-page" style="height:900px;"> 
     <div class="form-background"> 
     <div class="container-fluid" style="padding: 40px;"> 
      <h1>Filter Your Search!</h1> 
      <form role="form"> 
      <div class="row"> 
       <div class="form-group col-sm-6"> 
        <!-- <select id="country-select" class="form-control input-control"></select>--> 
        <div class="select"> 
         <span class="arr"></span> 
         <select data-bind=" options: _countries, 
              optionsText: country.countryName, 
              value: country.geonameId, 
              optionsCaption: 'Choose...'"> 
         </select> 
        </div> 
       </div> 
       <div class="form-group col-sm-6"> 
        <div class="select"> 
         <span class="arr"></span> 
         <select id="city-select"> 
         </select> 
        </div> 
       </div> 
      </div> 


      </form> 
     </div> 


</div> 

     </div> 
    </div> 
</body> 
</html> 

打字稿:

class HomeViewModel { 
    _countries = ko.observableArray(); 
    _cities = ko.observableArray(); 

    constructor(allCountries) { 
     for (var index = 0; index < allCountries.length; index++) { 
      this._countries.push(allCountries[index]); 
     } 
    } 
} 

var _homeViewModel: HomeViewModel; 

$(document).ready(function() { 
    $("#city-select").append('<option selected>Any Region</option>'); 
    $.ajax({ 
     url: "http://api.geonames.org/countryInfo?username=elion" 
    }).then(function(allCountriesXML) { 
     var allCountriesJSON = xml2json(allCountriesXML); 
     var allCountries = JSON.parse(allCountriesJSON); 
     _homeViewModel = new HomeViewModel(allCountries.geonames); 
     ko.applyBindings(_homeViewModel); 
    } 
); 

這裏是allCountries的值(從控制檯複製粘貼的小樣品):

[0 … 99] 
0: Object 
country: Object 
areaInSqKm: "468.0" 
capital: "Andorra la Vella" 
continent: "EU" 
continentName: "Europe" 
countryCode: "AD" 
countryName: "Andorra" 
currencyCode: "EUR" 
east: "1.786..." 

如果我將html更改爲:

<select data-bind=" options: _countries"> 
         </select> 

它可以工作,但<select>在選擇框中顯示[object] [object]。

如果我改變視圖模型的構造函數是:

constructor(allCountries) { 
     for (var index = 0; index < allCountries.length; index++) { 
      this._countries.push(allCountries[index].country.countryName); 
     } 
    } 

而且還保持HTML作爲本:

<select data-bind=" options: _countries"> 
         </select> 

它的工作原理,但我沒有在任何<select>值因爲我已經擺脫了javascript對象的數組,並將其作爲一個字符串數組。

如何將javascript對象數組綁定到<select>而不抱怨_countries未定義?是否發生這種情況是因爲我在文檔準備就緒後推入了_countries數組,而在html中,我在文檔加載之前綁定了ko.observableArray?如果是這樣,我確實嘗試用值來初始化ko.observableArray,但它沒有解決問題。

+0

你嘗試添加optionsText:'countryName',optionsValue:'someIdOfCountry'來綁定嗎? ..https://jsfiddle.net/8mx087a0/8/ –

+1

如果您發佈的代碼有幫助,如果你把它裁減到只有相關的部分。 – Jeroen

回答

1

使用Rohith的回答。爲了進一步闡述,導致錯誤的不是_countries,而是這些optionsText: country.countryName, value: country.geonameId,你的viewmodel不知道任何國家,這些值駐留在_countries可觀察數組內。而您使用options數據綁定參數的方式不正確。

查看docs瞭解有關此綁定的更多詳細信息。

只是爲了涵蓋您在此需要的內容,首先您使用optionsText,那個值應該是'countryName'。那麼對於value,這將是將保存所選選項的可觀察值。因此,在您的視圖模型中,您需要添加諸如countryselectedCountry之類的東西或任何您喜歡的名稱。

把它放到代碼中,你的改變就是這樣。 更改視圖模型:

class HomeViewModel { 
    _countries = ko.observableArray(); 
    _cities = ko.observableArray(); 
    selectedCountry = ko.observable(); 

    constructor(allCountries) { 
     for (var index = 0; index < allCountries.length; index++) { 
      this._countries.push(allCountries[index]); 
     } 
    } 
} 

然後在你的HTML數據綁定它會是這樣的。

<div class="select"> 
    <span class="arr"></span> 
    <select data-bind="options: _countries, 
         optionsText: 'countryName', 
         value: selectedCountry, 
         optionsCaption: 'Choose...'"> 
    </select> 
</div> 
相關問題