2013-01-14 21 views
2

我有一種情況,當某個observable發生更改時,我想執行任務,因此我設置了訂閱 - 但是我不希望在創建該項目時觸發它。KnockoutJS - 僅在初始化後觸發訂閱

http://jsfiddle.net/ciel/EeZjH/

基本上,「綁定」已被設置爲每個項目時,從控制器來的 - 所以我不希望發佈的更改呢。只有當它們從初始化值改變時。這是否合理?

function Item(data) { 
    this.Binding = ko.observable(data); 

    this.Binding.subscribe(function (newValue) { 
    console.log("The Binding is Now " + newValue); 
    }); 
} 

var viewModel = { 
    Options: ko.observableArray([{ 
    "Value": "1", 
     "Name": "One" 
    }, { 
    "Value": "2", 
     "Name": "Two" 
    }, { 
    "Value": "3", 
     "Name": "Three" 
    }]), 
    Items: ko.observableArray([]) 
}; 

viewModel.Items.push(new Item("1")); 
viewModel.Items.push(new Item("2")); 
viewModel.Items.push(new Item("3")); 

viewModel.output = ko.computed(function() { 
    return JSON.stringify(
    viewModel.Items().map(

    function (i) { 
    return i.Binding(); 
    })); 
}); 

ko.applyBindings(viewModel); 
+2

如果我理解正確的話,你要設法避免觸發勢必'Binding'功能創建對象時?我只是跑了你的小提琴,那個回調實際上沒有被調用。你能否進一步解釋這個問題? –

+0

你的假設是正確的。小提琴似乎從昨天被打破,不知道爲什麼。我認爲jsFiddle正在升級或什麼,它是干擾。 – Ciel

+0

如果您在小提琴上檢查控制檯,它會拋出各種隨機錯誤,我認爲這些錯誤與我的代碼無關。這些錯誤發生在我運行的每一個小工具中,不管框架是什麼,所以我相當肯定它與我的代碼無關。 – Ciel

回答

1
ko.observable.fn.beforeAndAfterSubscribe = function (callback, target) { 
var _oldValue; 
this.subscribe(function (oldValue) { 
    _oldValue = oldValue; 
}, null, 'beforeChange'); 
    this.subscribe(function (newValue) { 
    callback.call(target, _oldValue, newValue); 
}); 
};