【发布时间】:2013-02-01 17:17:01
【问题描述】:
我正在使用 knockoutjs 并尝试设置一个项目,包括 ko.mapping 和 observableArray 的自定义更新绑定。直接设置值时,更新绑定触发一次,使用 ko.mapping.fromJS 时,更新绑定触发两次。请参阅Fiddle 或以下代码:
<!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>
【问题讨论】:
-
我不确定你还在做什么,但这不会发生在我身上。您可以发布一个重现您所看到问题的小提琴吗? jsfiddle.net/tyrsius/Sgsh6
-
在您向我们展示您的标记之前,我们不可能给您一个合理的答案。您的标记中可能还有其他因素导致这种情况发生。
-
我修改了示例(之前确实是错误的)并尽可能简单地重现我的问题。
标签: knockout.js knockout-mapping-plugin