[knockout.js] KnockoutJs v2.3.0:錯誤您無法多次將綁定應用於同一元素


Answers

發生此異常的事情也會發生以下情況。 說你有:

ko.applyBindings(myViewModel1, document.getElementById('element1'));
...
ko.applyBindings(myViewModel2, document.getElementById('element2'));

現在,當#element1和#element2都不存在時,您將收到錯誤。 原因是當找不到#element1和#element2時,Knockout的applyBindings作為根元素返回到document.body。 現在它試圖在身體上施加兩次綁定......

如果你問我,不是Knockout的好退款。 我寧願有一個明確的錯誤消息,即該元素在DOM中尚不存在。

希望這有助於一些人。

Question

我剛剛升級到2.3.0,現在我收到錯誤'你不能多次將綁定應用到同一個元素。' 我沒有進入2.2.1。

我從MVC控制器獲取局部視圖,並在點擊href後將其添加到頁面中。 第二次單擊鏈接以獲取局部視圖時發生錯誤。 我這樣做了很多次。

有沒有辦法清除這一點並避免拋出新的錯誤?

這是我的代碼:

$.get(url + "GetAssignedCompaniesView?layoutId=" + layoutId + "&noCache=" + new Date().getMilliseconds(), function (result) {
              $("#editAssignedPartial").html($(result));
              showEditAssignedArea(true);
              $(window.document).ready(function () {
                 // error is thrown here
                 ko.applyBindings(self, window.document.getElementById("editAssigned"));
                 $("#layoutId").attr("value", layoutId);
                 updateTypeHiddenElement.attr("value", "companies");
      });
    });
<div id="editAssignedPartial">
</div>

$(document).ready(function () {
  'use strict';
  var vm = new Vm();
  ko.applyBindings(vm, document.getElementById("area1"));
});



我終於通過在綁定處理程序的init函數中返回{ controlsDescendantBindings: true }來解決我的問題。 看到this




我有同樣的問題,我解決了它。

var vm = new MessagesViewModel()
ko.applyBindings(vm)

function ShowMessagesList() {
   vm.getData("MyParams")
}

setInterval(ShowMessagesList, 10000)



對於上述解決方案而言,有兩件事是重要的:

  1. 在應用綁定時,您需要指定範圍(元素)!!

  2. 清除綁定時,必須指定與範圍完全相同的元素。

代碼如下

標記

<div id="elt1" data-bind="with: data">
    <input type="text" data-bind="value: text1" >
</form>

綁定視圖

var myViewModel = {
  "data" : {
    "text1" : "bla bla"
  }
}:

使用Javascript

ko.applyBindings(myViewModel, document.getElementById('elt1'));

清除綁定

ko.cleanNode(document.getElementById('elt1'));



已經有很多答案了!

首先,讓我們說我們需要在頁面中多次進行綁定是相當普遍的。 說,我在Bootstrap模式中有一個表單,它將一次又一次地加載。 許多表單輸入都有雙向綁定。

我通常採取簡單的方法:每次在綁定之前清除綁定。

var koNode = document.getElementById('formEdit');
ko.cleanNode(koNode);
ko.applyBindings(vm, koNode);

只需確保koNode是必需的,因為ko.cleanNode()需要一個node元素,即使我們可以在ko.applyBinding(vm)省略它。




我出現這種錯誤的原因不同。

我為保存/取消按鈕創建了一個模板,我希望它出現在頁面的頂部和底部。 當我在<script type =“text / html”>元素中定義模板時,它首先起作用....但後來我聽說你可以選擇用普通的DIV元素創建一個模板。

(這對我來說效果更好,因為我使用ASP.NET MVC並且我的@variableName Razor語法都沒有在運行時從腳本元素內部執行。所以通過改為DIV代替,我仍然可以使用MVC Razor引擎在頁面加載時在我的KnockoutJs模板中生成HTML。)

在我將模板更改為使用DIV而不是SCRIPT元素後,我的代碼看起來像這樣......在IE10上工作正常。 然而,後來當我在IE8上測試它時 ,它扔了....

“你不能多次對同一個元素應用綁定”錯誤.....

HTML

<div id="mainKnockoutDiv" class="measurementsDivContents hourlyMeasurements">

  <div id="saveButtons_template" style="display: none;">
    ... my template content here ...
  </div>

  <!--ko template: { name: 'saveButtons_template' } -->
  <!--/ko-->

  Some_HTML_content_here....

  <!--ko template: { name: 'saveButtons_template' } -->
  <!--/ko-->

</div>

JavaScript的

ko.applyBindings(viewModel, document.getElementById('mainKnockoutDiv'));

解決方案

我所要做的就是將我的saveButtons_template DIV向下移動到底部,以便它在mainKnockoutDiv之外。 這解決了我的問題。

我想KnockoutJs試圖多次綁定我的模板DIV,因為它位於applyBindings目標區域內...並且沒有使用SCRIPT元素....並且被引用作為模板。




Related