Убрать вид модели из вида в нокауте

Я ищу функции отмены привязки в нокауте. К сожалению, поиск в Google и просмотр заданных здесь вопросов не дали мне никакой полезной информации по этой теме.

Я приведу пример, чтобы проиллюстрировать, какая функциональность требуется.

Допустим, у меня есть форма с несколькими входами. Также у меня есть модель представления, привязанная к этой форме. По какой-то причине в качестве реакции на действия пользователя мне нужно отсоединить мою модель представления от формы, то есть, поскольку действие выполнено, я хочу, чтобы все мои наблюдаемые перестали реагировать на изменения соответствующих значений и наоборот - любые изменения, сделанные в наблюдаемых, не должны & apos; t влияет на значения входов.

Каков наилучший способ достичь этого?

Ответы на вопрос(3)

Решение Вопроса

ko.cleanNode удалить привязки. Вы можете применить это к определенным элементам DOM или контейнерам DOM более высокого уровня (например, ко всей форме).

Увидетьhttp://jsfiddle.net/KRyXR/157/ для примера.

 ILya15 июн. 2012 г., 15:17
блестящий! Спасибо!
 10 дек. 2013 г., 16:40
Я был бы удивлен, если бы это было даже больше чем 1 мс.
 06 мар. 2013 г., 16:57
в следующий раз напишите getElementById, а не $ (& quot; # theid & quot;) [0], все же лучше использовать JavaScript, а не jQuery для всего
 24 июн. 2014 г., 23:29
Обратите внимание, чтоcleanNode() действительно ли (делал? с 2.2.1), по крайней мере, стереть этот узел с его обработчиками событий и т. д. Плохая новость для меня, например, когда у меня был модал начальной загрузки с привязкой к ко. Больше здесь:github.com/knockout/knockout/issues/1130
 15 мар. 2013 г., 00:21
Для проектов, в которых я использую jquery, я, как правило, рад отдать 1,5 мс, чтобы избежать ввода дополнительных 15 символов. Я думаю, что буду придерживаться селекторов jquery, когда у меня будет такая возможность.

Тем не менее, используя ответ Марк, я сделал следующее, что может оказаться полезным.

  // get the DOM element
  var element = $('div.searchRestults')[0];
  //call clean node, kind of unbind
  ko.cleanNode(element);
  //apply the binding again
  ko.applyBindings(searchResultViewModel, element);
 02 авг. 2013 г., 04:12
+1 для ko.cleanNode (элемент)
 14 июн. 2014 г., 02:55
Мне пришлось использовать это после ручного отключения / включения элементов формы, чтобы восстановить автоматическое отключение нокаутаenable привязок.

<html>
    <head>
        <script type="text/javascript" src="jquery-1..3.js"></script>
        <script type="text/javascript" src="knockout-2.2.1.js"></script>
        <script type="text/javascript" src="knockout-2.2.1.debug.js"></script>
        <script type="text/javascript" src="clickHandler.js"></script>
    </head>
    <body>
        <div class="modelBody">
            <div class = 'modelData'>
                <span class="nameField" data-bind="text: name"></span>
                <span class="idField" data-bind="text: id"></span>
                <span class="lengthField" data-bind="text: length"></span>
            </div>
            <button type='button' class="modelData1" data-bind="click:showModelData.bind($data, 'model1')">show Model Data1</button>
            <button type='button' class="modelData2" data-bind="click:showModelData.bind($data, 'model2')">show Model Data2</button>
            <button type='button' class="modelData3" data-bind="click:showModelData.bind($data, 'model3')">show Model Data3</button>
        </div>
    </body>
</html>

@Mark Robinson предоставил идеальное решение, я схожую проблему с одним элементом DOM и обновил различные модели представлений на этом элементе DOM.

Каждая модель представления имеет событие щелчка, когда щелчок происходит каждый раз, когда вызывается метод щелчка каждой модели представления, что приводит к выполнению ненужных блоков кода во время события щелчка.

Я следовал подходу @Mark Robinson, чтобы очистить узел перед тем, как применить мои фактические привязки, это действительно сработало. Спасибо, Робин. Мой пример кода выглядит следующим образом.

function viewModel(name, id, length){
		var self = this;
		self.name = name;
		self.id = id;
		self.length = length;
	}
	viewModel.prototype = {
		showModelData: function(data){
		console.log('selected model is ' + data);
		if(data=='model1'){
			ko.cleanNode(button1[0]);
			ko.applyBindings(viewModel1, button1[0]);
			console.log(viewModel1);
		}
		else if(data=='model2'){
		ko.cleanNode(button1[0]);
			ko.applyBindings(viewModel3, button1[0]);
			console.log(viewModel2);
		}
		else if(data=='model3'){
		ko.cleanNode(button1[0]);
			ko.applyBindings(viewModel3, button1[0]);
			console.log(viewModel3);
		}
	} 
	}
	$(document).ready(function(){
		button1 = $(".modelBody");
		viewModel1 = new viewModel('TextField', '1', 32);
		viewModel2 = new viewModel('FloatField', '222', 64);
		viewModel3 = new viewModel('LongIntField', '333', 108);
		ko.applyBindings(viewModel1, button1[0]);
	});
	

Ваш ответ на вопрос