Ada*_*itt 13 javascript dialog modal-dialog late-binding knockout.js
我正在使用knockout.js来显示员工列表.我在页面上有一个隐藏的模态标记.单击单个员工的"详细信息"按钮时,我希望将该员工数据绑定到模式弹出窗口.我正在使用ko.applyBindings(employee,element),但问题是当页面加载时,它期望模态从绑定到某个东西开始.
所以我想知道,有一个技巧/策略来做延迟/延迟数据绑定吗?我查看了虚拟绑定,但文档不够有用.
谢谢!
小智 37
我想提出一种不同的方式来处理MVVVM中的模态.在MVVM中,ViewModel是View的数据,View负责UI.如果我们检查这个提议:
this.detailedEmployee = ko.observable({}),
var self = this;
this.showDetails = function(employee){
self.detailedEmployee(employee);
$("#dialog").dialog("show"); //or however your dialog works
}
Run Code Online (Sandbox Code Playgroud)
我非常同意this.detailedEmployee = ko.observable({}),但我对这一方面存在强烈不同意见:$("#dialog").dialog("show");.这段代码放在ViewModel中并显示模态窗口,其中它是View的职责,因此我们搞砸了MVVM方法.我会说这段代码将解决你当前的任务,但它可能会在未来引起很多问题.
detailedEmployee为undefined使主ViewModel处于一致状态.至于我,这些要点非常关键,所以我想提出一个不同的方法.如果我们"忘记"您需要在弹出窗口中显示数据,绑定with可以解决您的问题.
this.detailedEmployee = ko.observable(undefined);
var self = this;
this.showDetails = function(employee){
self.detailedEmployee(employee);
}
<div data-bind="with: detailedEmployee">
Data to show
</div>
Run Code Online (Sandbox Code Playgroud)
如您所见,您的ViewModel不知道如何显示数据.它只知道应该显示的数据.的with结合将只显示当内容detailedEmployee被定义.接下来,我们应该找到一个类似with但只能在弹出窗口中显示内容的绑定.我们给它起名字吧modal.它的代码是这样的:
ko.bindingHandlers['modal'] = {
init: function(element) {
$(element).modal('init');
return ko.bindingHandlers['with'].init.apply(this, arguments);
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var returnValue = ko.bindingHandlers['with'].update.apply(this, arguments);
if (value) {
$(element).modal('show');
} else {
$(element).modal('hide');
}
return returnValue;
}
};
Run Code Online (Sandbox Code Playgroud)
如您所见,它在with内部使用插件,并根据传递给绑定的值显示或隐藏弹出窗口.如果定义 - 'show'.如果不是 - '隐藏'.它的用法如下:
<div data-bind="modal: detailedEmployee">
Data to show
</div>
Run Code Online (Sandbox Code Playgroud)
你唯一需要做的就是使用你最喜欢的模态插件.我用Twitter Bootstrap弹出组件准备了一个例子:http://jsfiddle.net/euvNr/embedded/result/
在此示例中,自定义绑定功能更强大; 您可以订阅onBeforeClose事件并在需要时取消此事件.希望这可以帮助.
小智 1
我将创建另一个包含员工的可观察对象。
this.detailedEmployee = ko.observable({}),
var self = this;
this.showDetails = function(employee){
self.detailedEmployee(employee);
$("#dialog").dialog("show"); //or however your dialog works
}
Run Code Online (Sandbox Code Playgroud)
将单击附加到showDetails. 然后你就可以在页面加载时调用applyBindings。
| 归档时间: |
|
| 查看次数: |
12743 次 |
| 最近记录: |