Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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
Javascript 敲除:错误:刷新页面时不能对同一元素多次应用绑定_Javascript_Knockout.js - Fatal编程技术网

Javascript 敲除:错误:刷新页面时不能对同一元素多次应用绑定

Javascript 敲除:错误:刷新页面时不能对同一元素多次应用绑定,javascript,knockout.js,Javascript,Knockout.js,我正在使用Knockout绑定MVC视图。这在第一次使用时效果很好,但对于后续刷新,Knockout会抛出错误: 错误:不能对同一元素多次应用绑定 这是我的绑定代码(在Document.Ready中),请注意,我使用setTimeout每25秒运行一次,这就是发生错误的地方: function viewModel() { Loading = ko.observable(true), CurrentUser = ko.observable(), Environm

我正在使用Knockout绑定MVC视图。这在第一次使用时效果很好,但对于后续刷新,Knockout会抛出错误:

错误:不能对同一元素多次应用绑定

这是我的绑定代码(在Document.Ready中),请注意,我使用setTimeout每25秒运行一次,这就是发生错误的地方:

function viewModel() {
      Loading = ko.observable(true),
      CurrentUser = ko.observable(),
      Environments = ko.observableArray(),
      CurrentFormattedDate = ko.observable()
   }   

function doPoll() {
             $.get("/home/getindex")
                 .done(function (data) {
                     $(data).each(function (index, element) {
                         viewModel = data;
                         viewModel.Loading = false;
                         viewModel.CurrentFormattedDate = moment().format('MMMM YYYY');
                     });
                     ko.applyBindings(viewModel);                     
                 })
                 .always(function () {
                     setTimeout(doPoll, 25000);
                 })
                 .error(function (ex) {
                     alert("Error");
                 });
            };

            doPoll();

当多次调用DoPoll时,如何避免错误?

默认情况下,每个dom元素只能执行一次Knockout中的绑定。
ko.aplyBindings
会将绑定应用于文档体,因此当您从
doPoll
函数第二次调用它时,它已经与数据绑定

一个可能的解决方案是使当前视图模型成为新视图模型的可观察属性;然后仅更新可观察属性:

var actualViewModel = {
    innerViewModel: ko.observable(new viewModel());
}   

function doPoll() {
    $.get("/home/getindex")
       .done(function (data) {
           $(data).each(function (index, element) {
                   data.Loading = false;
                   data.CurrentFormattedDate = moment().format('MMMM YYYY');
                   actualViewModel.innerViewModel(data);
               });                  
           })
       .always(function () {
                setTimeout(doPoll, 25000);
           })
       .error(function (ex) {
                alert("Error");
           });
 };

 doPoll();
您需要针对新视图模型调用初始绑定:

ko.applyBindings(actualViewModel);
您还需要更新绑定中访问属性的方式,方法是将
innerViewModel
放在前面,例如:

<div data-bind="text: CurrentFormattedDate">...</div> 
。。。
必须成为

<div data-bind="text: innerViewModel.CurrentFormattedDate">...</div>
。。。

为什么要使用
$(数据)。每个
?您似乎从未使用
索引
/
元素
参数,而只是在循环中更新相同的对象。结果相当于根本不使用循环。另外,我发现
viewModel
对象是错误的。您需要将
this
放入成员初始化中,如
this.Loading=…
,否则假定的成员将成为全局变量,这在JS中是一种不好的做法!。啊,好地方。该模型以前绑定到一个集合,我忽略了更新代码!谢谢你的提示,我试试看。