2013-05-02 78 views
1

我對淘汰賽相當陌生,並試圖瞭解一些綁定應該如何工作。我必須使用具有約束力的淘汰賽嗎?

我認爲我可以引用一個普通綁定中可觀察的孩子,而不需要使用但我無法使其工作。

我的模型和視圖模型是;

 Model = function(name) { 
      this.name = ko.observable(name); 
     }; 

     ViewModel = function() { 


      var list = ko.observableArray([new Model("Apple"), new Model("Pear")]), 
       selectedItem = ko.observable(); 

      function selectItem(item) { 
       selectedItem(item); 
      } 

      return { 
       list: list, 
       selectedItem: selectedItem, 
       selectItem: selectItem 
      }; 
     }; 

和這裏的綁定:

 <div id="content"> 
     <ul id="list" data-bind="foreach: list"> 
      <li data-bind="text: name, click: $parent.selectItem"></li> 
     </ul> 
    </div> 

    <p>Will show selected item</p> 
    <div data-bind="with: selectedItem"> 
     <span data-bind="text: name"></span> 
    </div> 
    <div> 
     <p>Won't show selected item</p> 
     <span data-bind="text: selectedItem().name()"></span> 
    </div> 

或者工作fiddle在這裏。

據我瞭解,我應該能夠看到selectedItem().name的值,但應用綁定會拋出一個錯誤,但是如果div具有綁定with: selectedItem,則它會很好地工作。

我有沒有選擇,但在這種情況下使用with綁定?

回答

2

with在設置綁定上下文旁邊的彎曲也處理值爲nullundefinied時的情況。

documentation

如果提供的表達式求nullundefined後代元素不會在所有的約束,而是改爲從文件中刪除。

如果你不想使用with你必須處理nullundefinied情況下,「手動」,所以你只能叫name()如果selectedItem()返回的東西。

這可以通過聲明selectedItem() && selectedItem().name()完成。 (null,空字符串和undefinied評估爲false evertying否則就是true。)

所以下面結合正在工作:

<span data-bind="text: selectedItem() && selectedItem().name()"></span> 

演示JSFiddle.

+0

啊是有道理的,因爲當第一個結合發生沒有選定的項目。非常感謝。 – Nathan 2013-05-03 07:01:14