我使用knockoutjs並嘗試設置一個項目,包括ko.mapping和一個observableArray的自定義更新綁定。當直接設置值時,更新綁定觸發一次,當使用ko.mapping.fromJS時,更新綁定觸發兩次。請參見下面Fiddle或代碼:爲什麼在使用ko.mapping和observableArray時更新綁定會觸發兩次?
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="knockout-2.2.1.js"> </script>
<script type="text/javascript" src="knockout.mapping.js"></script>
</head>
<body>
<div data-bind="foreach: ObservableArray, updateBinding: ObservableArray">
<span data-bind="text: Value"></span>
</div>
<script type="text/javascript">
ko.bindingHandlers['updateBinding'] = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
console.log("Binding Handler (Init)");
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
console.log("Binding Handler (Update)");
var data = ko.utils.unwrapObservable(valueAccessor());
}
};
function MainViewModel() {
var self = this;
self.ObservableArray = ko.observableArray();
}
var viewModel = new MainViewModel();
// Fires Init + Update for ObservableArray
ko.applyBindings(viewModel);
// Setting directly fires Update for ObservableArray once
viewModel.ObservableArray([{ "Value": "Lucky Luke" }]);
// Setting via mapping fires Update for ObservableArray twice
ko.mapping.fromJS({ "ObservableArray": [{ "Value": "Ludwig van Beethoven" }] }, {}, viewModel);
</script>
</body>
</html>
我不確定你在做什麼,但這不會發生在我身上。你可以發佈一個可以複製你所看到的問題的小提琴嗎? http://jsfiddle.net/tyrsius/Sgsh6/ – Tyrsius
在您向我們展示您的標記之前,我們無法給您一個合理的答案。您的標記中可能還有其他因素會導致這種情況發生。 –
我修改了樣本(之前的確是錯誤的),並儘可能簡單地重現我的問題。 – Dresel