2012-10-31 96 views
0

這裏有兩個樣品:
樣品1:http://jsfiddle.net/TheMetalDog/yYAFJ/9/
樣品2:http://jsfiddle.net/TheMetalDog/yYAFJ/11/
KnockoutJs - 可觀察綁定和範圍

在樣品1中,可觀察到的是視圖模型之外,並且從選擇列表中選擇的標題在您添加項目時單獨附加到模板項目。

var selectedTitle = ko.observable(); 

在樣品2中,可觀察到的是視圖模型的內部,所有綁定到可觀察的項目是同步的,當你添加項目一起更新。

viewModel.selectedTitle = ko.observable(); 

在模塊環境或更具體的requirejs內工作時,是否有建議的策略來獲取Sample 1行爲?

回答

0

Knockout 2.2的observables的新peek函數處理這種情況。下面是更新後的jsfiddle:http://jsfiddle.net/TheMetalDog/fD5kF/

這裏的區別是加入.peek()<span data-bind="text: $root.selectedTitle.peek()"></span>

+0

不幸的是,這不是真的有幫助。它不會將選定的標題與您添加的項目相關聯。該名稱顯示在視圖上,但如果再次呈現視圖,則會全部丟失。 –

1

目前還不清楚你的代碼試圖做什麼。看起來你有兩個獨立的視圖模型,你希望他們互相交互。如果是這種情況,您可能需要使用postbox。它可以讓你保持你的視圖模型分離,但仍然允許他們相互溝通。

因此,您希望選取標題,並在視圖模型中創建新項目或子項目時使用它。

只是爲了避免它,你真的需要添加一個title屬性到你的項目。將項目映射到另一個具有可觀察的對象title

function Item(data) { 
    var self = this; 
    self.title = ko.observable(data.title); // add a 'title' property to all items 
    self.name = ko.observable(data.name); 

    // map any existing child items to new Items 
    self.childItems = ko.observableArray(ko.utils.arrayMap(data.childitems, function (item) { 
     return new Item(item); 
    })); 
} 

我認爲最簡單的方法是創建一個「添加」和「的addChild」主題,讓您的視圖模型訂閱。當您獲得該主題的更新時,可以使用該標題添加新項目。然後從你的外部來源,讓它發佈到適當的主題你希望使用的標題。

function ViewModel(data) { 
    var self = this; 

    // ... 

    var i = 5; 
    function newItem(title) { 
     return new Item({ 
      title: title, 
      name: i++, 
      childItems: [] 
     }); 
    } 
    ko.postbox.subscribe('add', function (title) { 
     // a title was received for the `add` topic, add it 
     self.items.push(newItem(title)); 
    }); 
    ko.postbox.subscribe('addChild', function (title) { 
     // a title was received for the `addChild` topic, add it 
     var firstItem = self.items()[0]; 
     if (firstItem) { 
      firstItem.childItems.push(newItem(title)); 
     } 
    }); 
} 
// add a new item using the selected title 
ko.postbox.publish('add', selectedTitle()); 

// add a new child item using the selected title 
ko.postbox.publish('addChild', selectedTitle()); 

updated your fiddle證明你或許應該做的事情。

+0

感謝傑夫......你提出的解決方案的問題是,行爲仍然是樣品2沒有樣品1當您選擇標題,依賴項會導致每個條目都更新到當前選定的標題,而不是在添加條目時保留所選標題。我很抱歉沒有把問題的細節弄清楚。 – user1247057

+0

哦,所以你想在添加物品或孩子時使用選定的標題?那很簡單。 –