在Knockout视图模型中调用jQuery插件是一种有效的模式
Is calling jQuery plugins in a Knockout view model a valid pattern?
我经常创建自定义绑定处理程序来更改DOM。但有时我会遇到这样的情况:我想把这种代码放在subscribe
处理程序中。
MyModel =
{
this.name = ko.observable();
this.name.subscribe(function()
{
// is it correct to do these kind of calls inside a model?
$.ajax(
{
url: "... url that creates customer on server ...",
success: function()
{
$(".container_element").noty(
{
text: "Customer created!"
});
}
});
});
}
Noty是一个弹出警报消息的jQuery插件,由于Noty实际上更改了DOM,建议的设计模式是什么?
如果您想在视图模型内部执行DOM操作,通常是一个危险信号(除了一些例外,最显著的是beforeRender
&friends回调)。这是因为通常,使用MVVM风格的编程,您有一个依赖于视图模型的视图轻量级(具有声明性绑定),并且没有从视图模型到视图的依赖关系。这很好的两个主要原因:
- 您的虚拟机与视图没有紧密耦合,因此您可以根据同一视图模型轻松创建不同的视图
- 您的虚拟机更容易进行单元测试,因为测试单元不需要DOM
您已经提到了,您可能应该使用的东西:自定义绑定处理程序来自相关文档:
这就是如何控制可观察性如何与DOM元素交互,并为您提供了很大的灵活性,可以以易于重用的方式封装复杂的行为。
我找不到"Noty"示例自定义绑定,所以您必须创建自己的绑定(这通常并不难)。您可以从这个jQueryUI自定义绑定以及文档中获得一些灵感。
用你的例子把它放在代码中,事情看起来像这个:
ko.bindingHandlers.noty = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// Set up any initial state, event handlers, etc. here
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element);
if(!!value) { $($el).noty({text: value}); }
}
};
// Mock $.ajax for this example
$.ajax = function(options) { options.success({}); }
MyModel = function()
{
var self = this;
this.name = ko.observable();
this.myAlertMsg = ko.observable("");
this.name.subscribe(function()
{
// is it correct to do these kind of calls inside a model?
$.ajax(
{
url: "... url that creates customer on server ...",
success: function()
{
self.myAlertMsg("Customer created!");
}
});
});
}
ko.applyBindings(new MyModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-noty/2.3.4/packaged/jquery.noty.packaged.min.js"></script>
<div data-bind="noty: myAlertMsg"></div>
<input data-bind="value: name" /> (blur input to finish editing name)
请注意,我们需要var self = this
习惯用法,以便能够在success
回调中轻松引用视图模型。
相关文章:
- parseJSON在一种情况下有效,而在另一种情况中无效
- 在Knockout视图模型中调用jQuery插件是一种有效的模式
- Js-一种在DOM中查找第n个元素的更优雅/更有效的方法
- 一种确定网站是否有效的方法
- window.name 作为数据传输:一种有效的方法
- 有没有一种有效的方法来执行不区分大小写的 JavaScript 对象属性名称查找
- 为什么在Lightswitch中堆叠承诺的一种方法有效,而另一种方法则不起作用
- 寻找一种保持菜单标签的有效方法
- 两者中的哪一种是最有效的方法
- 一种getter语法有效,但另一种无效;t
- 这些在JavaScript中向现有对象添加属性的方法有何不同(一种有效,一种无效)
- 有没有一种更有效的方法来找到对象的返回子集
- 用jquery预处理html的一种方法有效,但为什么另一种方法无效't
- 有效地将单位从一种系统转换为另一种系统
- 一种从indexedDB对象存储中删除缺少属性的对象的有效方法
- 是否有一种方法来检查SVG是否有有效的源代码?(创建SVG到画布的问题)
- 是否有一种有效的方法来传递用户端JS数据到后端c#,每次它的变化
- 一种将线性数组转换为矩阵的有效方法
- 是否有一种有效的方法来测试字符串是否包含非重叠子字符串以匹配正则表达式数组
- 是否有一种有效的方法来生成浏览器数组缓冲区的MD5哈希