Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 为什么将ko.mapping与ObservalArray一起使用时更新绑定触发两次?_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Knockout.js 为什么将ko.mapping与ObservalArray一起使用时更新绑定触发两次?

Knockout.js 为什么将ko.mapping与ObservalArray一起使用时更新绑定触发两次?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我正在使用knockoutjs并尝试设置一个项目,包括ko.mapping和observableArray的自定义更新绑定。直接设置值时,更新绑定触发一次,使用ko.mapping.fromJS时,更新绑定触发两次。请参阅下面的代码: <!DOCTYPE html> <html> <head> <script type="text/javascript" src="knockout-2.2.1.js"> </script>

我正在使用knockoutjs并尝试设置一个项目,包括ko.mapping和observableArray的自定义更新绑定。直接设置值时,更新绑定触发一次,使用ko.mapping.fromJS时,更新绑定触发两次。请参阅下面的代码:

<!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>

ko.bindingHandlers['updateBinding']={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
log(“绑定处理程序(Init)”;
},
更新:函数(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
log(“绑定处理程序(更新)”;
var data=ko.utils.unwrapobbservable(valueAccessor());
}
};
函数MainViewModel(){
var self=这个;
self.observearray=ko.observearray();
}
var viewModel=new MainViewModel();
//激发ObservalArray的初始+更新
应用绑定(视图模型);
//设置直接触发一次ObservalArray的更新
viewModel.observearray([{“Value”:“Luke”}]);
//通过映射进行设置将触发ObservalArray的更新两次
fromJS({“observearray”:[{“Value”:“路德维希·范·贝多芬”}]},{},视图模型);

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

updateBinding: People().Records()
应该是:

updateBinding: People().Records

稍微调整了一下:

这是在常规对象中嵌入数组时通过knockout.mapping产生的错误,现在已修复(请参阅)。

我不确定您还做了什么,但我不会这样做。你能贴一张复制你看到的问题的小提琴吗?除非你们也向我们展示你们的加价,否则我们不可能给你们一个合理的答复。您的标记中可能还有其他因素导致了这种情况的发生。我修改了示例(前面的示例确实是错误的),并尽可能简单地重现了我的问题。这就是我不确定的部分-为什么不使用括号时更新绑定不在fromJS上启动-为什么它使用括号启动?映射插件是否覆盖绑定dom的初始视图模型?我怎么能阻止它呢?在没有映射插件的情况下尝试一下。我必须在更新绑定中创建一个依赖项,否则knockoutjs不会触发它(请参阅)。但是问题仍然是一样的-我试图学习和理解映射插件,手动映射不是一个选项:)我的观点是,映射插件有很多bug和奇怪之处,这可能是其中之一。你是对的,这确实是一个bug,现在已经修复。谢谢。我今天也有同样的经历,所以不确定它是否已修复。我的fiddle示例()正在使用一个新的knockout.mapping版本。我发现我的问题出在一个ajax.post调用中,我没有给它提供JSON数据,这导致了一个错误,触发它以某种方式重试。