【问题标题】:Why is update binding firing twice when using ko.mapping with observableArray?为什么将 ko.mapping 与 observableArray 一起使用时更新绑定会触发两次?
【发布时间】: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


【解决方案1】:

这是在常规对象中嵌入数组时由 knockout.mapping 引起的错误,现已修复(请参阅 github)。

【讨论】:

  • 我今天也有同样的经历,所以不确定它是否已修复。
  • 我的小提琴示例 (jsfiddle.net/edNCJ) 正在使用新的 knockout.mapping 版本。
  • 我发现我的问题出在一个 ajax.post 调用中,我没有给它 JSON 数据,这导致了一个错误,触发它以某种方式重试。
【解决方案2】:

您不需要在 updateBinding 绑定中使用完整的函数调用语法,因为它不是表达式。

updateBinding: People().Records()

应该是:

updateBinding: People().Records

稍作调整:http://jsfiddle.net/twRFf/3/

【讨论】:

  • 这是我不确定的部分 - 为什么在省略括号时更新绑定没有在 fromJS 触发 - 为什么它用括号触发?映射插件是否覆盖了 dom 绑定到的初始视图模型?我怎样才能防止这种情况发生?
  • 不用映射插件试试。它并非没有问题。
  • 我必须在更新绑定中创建一个依赖,否则 knockoutjs 不会触发它(请参阅stackoverflow.com/a/14716216/1249506)。但是问题保持不变-我尝试学习和理解映射插件,手工映射不是一种选择:)
  • 我的意思是,映射插件有许多错误和奇怪之处,这可能就是其中之一。
  • 你是对的,这确实是一个错误,现在已修复。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2021-07-08
  • 2014-10-05
相关资源
最近更新 更多