jQuery DOM 来自 Knockout ViewModel 的操作 - 使用 bindingHandlers?
jQuery DOM manipulation from Knockout ViewModel - use bindingHandlers?
我有一个淘汰的 viewModel,它看起来像这样:
function myViewModel() {
this.update = function() {
...
}
...
}
还有一个 bindingHandler,如下所示:
ko.bindingHandlers.myBindingHandler = {
init: function(element, valueAccessor, allBindings, viewModel) {
function manipulateDom(element) {
...
}
}
}
我希望 myViewModel 在调用更新方法时调用 manipulateDom。
我可以使用 bindingHandler 中的回调集来做到这一点:
function myViewModel() {
this.update = function() {
...
this.myBindingHandlerCallback();
}
...
}
ko.bindingHandlers.myBindingHandler = {
init: function(element, valueAccessor, allBindings, viewModel) {
viewModel.myBindingHandlerCallback = manipulateDom.bind(null, element);
}
}
<div data-bind="myBindingHandler: null"></div>
我的另一个想法是使用 'updateCount' observable 并在 bindingHandler 中订阅它:
function myViewModel() {
this.updateCount = ko.observable(0);
this.update = function() {
...
this.updateCount(this.updateCount() + 1);
}
...
}
ko.bindingHandlers.myBindingHandler = {
update: function(element) {
manipulateDom(element);
}
}
<div data-bind="myBindingHandler: updateCount"></div>
这两种解决方案都让人感到脆弱和混乱。 'knockout' 解决此类问题的方法是什么?我应该只从 viewModel 中操纵 DOM 吗?
我应该补充一点,manipulateDom 函数有很多逻辑不适用于淘汰赛(测量 window 高度,测量 DIV 高度等...)
谢谢!
第二种方法(带计数器)要好得多,因为 ViewModel 不应通过覆盖其属性来覆盖和更改 ViewModel 的行为。
如果您的 update 方法对其他可观察属性做了一些更改,我将创建一个计算 属性 来订阅当前状态,而不是使用计数器ViewModel 并自动调用您的 DOM 操作绑定,如果您将它作为绑定参数传递,则无需递增计数器或任何其他标志。
我有一个淘汰的 viewModel,它看起来像这样:
function myViewModel() {
this.update = function() {
...
}
...
}
还有一个 bindingHandler,如下所示:
ko.bindingHandlers.myBindingHandler = {
init: function(element, valueAccessor, allBindings, viewModel) {
function manipulateDom(element) {
...
}
}
}
我希望 myViewModel 在调用更新方法时调用 manipulateDom。
我可以使用 bindingHandler 中的回调集来做到这一点:
function myViewModel() {
this.update = function() {
...
this.myBindingHandlerCallback();
}
...
}
ko.bindingHandlers.myBindingHandler = {
init: function(element, valueAccessor, allBindings, viewModel) {
viewModel.myBindingHandlerCallback = manipulateDom.bind(null, element);
}
}
<div data-bind="myBindingHandler: null"></div>
我的另一个想法是使用 'updateCount' observable 并在 bindingHandler 中订阅它:
function myViewModel() {
this.updateCount = ko.observable(0);
this.update = function() {
...
this.updateCount(this.updateCount() + 1);
}
...
}
ko.bindingHandlers.myBindingHandler = {
update: function(element) {
manipulateDom(element);
}
}
<div data-bind="myBindingHandler: updateCount"></div>
这两种解决方案都让人感到脆弱和混乱。 'knockout' 解决此类问题的方法是什么?我应该只从 viewModel 中操纵 DOM 吗?
我应该补充一点,manipulateDom 函数有很多逻辑不适用于淘汰赛(测量 window 高度,测量 DIV 高度等...)
谢谢!
第二种方法(带计数器)要好得多,因为 ViewModel 不应通过覆盖其属性来覆盖和更改 ViewModel 的行为。
如果您的 update 方法对其他可观察属性做了一些更改,我将创建一个计算 属性 来订阅当前状态,而不是使用计数器ViewModel 并自动调用您的 DOM 操作绑定,如果您将它作为绑定参数传递,则无需递增计数器或任何其他标志。