- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 KnockoutJs 的新手,所以我希望有一个众所周知的最佳实践来解决我一直找不到的这种情况。
我有一个包含项目数组的 View 模型。我想使用模板显示这些项目。我还希望每个项目都能够在适当的 View 和编辑模式之间切换。我认为最适合 Knockout 的是在主视图模型或(可能更好)数组中的每个项目上创建相关函数,然后在模板中绑定(bind)此函数。所以我在我的页面上创建了这段代码:
<ul data-bind="template: {name: testTemplate, foreach: items}"></ul>
<script id="testTemplate" type="text/x-jquery-tmpl">
<li>
<img src="icon.png" data-bind="click: displayEditView" />
<span data-bind="text: GBPAmount"></span>
<input type="text" data-bind="value: GBPAmount" />
</li>
</script>
<script>
(function() {
var viewModel = new TestViewModel(myItems);
ko.applyBindings(viewModel);
})();
</script>
这在一个单独的文件中:
function TestViewModel(itemsJson) {
this.items = ko.mapping.fromJS(itemsJson);
for(i = 0; i < this.items.length; ++i) {
this.items[i].displayEditView = function () {
alert("payment function called");
}
}
this.displayEditView = function () {
alert("viewmodel function called");
}
};
由于我的 JS 运行的环境,我无法向全局命名空间添加任何内容,因此无法使用匿名函数来创建和设置 View 模型。 (有一个命名空间,如果需要,我可以向其中添加内容。)这个限制似乎打破了我发现的所有示例,这些示例似乎依赖于全局 viewModel 变量。
附言如果有比我正在尝试做的更适合 knockoutJS 的方法,请随时提出建议!
最佳答案
当您的 viewModel 不可全局访问时,有几个选项。
首先,您可以使用 templateOptions
参数将任何相关方法传递给模板绑定(bind)。
它看起来像(还要注意静态模板名称应该用引号引起来):
data-bind="template: {name: 'testTemplate', foreach: items, templateOptions: { vmMethod: methodFromMainViewModel } }"
然后,模板内部的 vmMethod
将作为 $item.vmMethod
可用。如果您使用 templateOptions 作为最后一个参数,请确保大括号 { {
之间有一个空格,否则 jQuery 模板会尝试将其解析为自己的。
因此,您可以像这样绑定(bind)它:
<img src="icon.png" data-bind="click: $item.vmMethod" />
另一种选择是在每个项目上放置一个方法和对 View 模型中任何相关内容的引用。看起来您正在探索该选项。
最后,在 KO 1.3 中(希望在 9 月发布并很快进入 beta 版)将有一个很好的方法来使用类似 jQuery 的实时/委托(delegate)功能并将其与您的 viewModel 连接(如本示例中:http://jsfiddle.net/rniemeyer/5wAYY/)
此外,此 post 的“避免事件绑定(bind)中的匿名函数”部分也可能对你有帮助。如果您正在寻找使用动态选择的模板进行就地编辑的示例,那么这个 post可能有帮助。
关于javascript - 如何在没有全局 viewModel 的情况下将点击处理程序绑定(bind)到 knockoutjs 中的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174153/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!