Ada*_*itt 32 data-binding scope knockout.js
我想知道我是否可以从viewModel本身范围之外的方法访问knockout.js主viewModel.举个例子:
function Employee(data) {
var self = this;
ko.mapping.fromJS(data, {}, this);
}
function EmployeeViewModel() {
var self = this;
this.employees = ko.observableArray([]);
this.loadEmployees = function() {
var mappedEmployees= $.map(JSON.parse(data.value), function(item) { return new Employee(item) });
self.employees (mappedEmployees);
}
}
// here's the part I'm curious about
$(document).ready(function() {
ko.applyBindings(new EmployeeViewModel());
$("#myLink").click(function() {
// is there some way to get back into the ko context here?
// like with ko.dataFor or ko.contextFor?
});
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*aat 51
你总是可以通过将viewmodel存储在你可以访问的变量中来访问它,模块和显示模块模式很好,但是你可以将它存储在一个不会与其他名称冲突的对象中('my'here):
my = { viewModel: new EmployeeViewModel() };
ko.applyBindings(my.viewModel);
Run Code Online (Sandbox Code Playgroud)
你有正确的想法,你只需要将元素作为你的click函数的参数并将target属性传递给ko.dataFor或ko.contextFor(jsfiddle):
$(document).ready(function() {
my.vm = new EmployeeViewModel();
ko.applyBindings(my.vm);
$('button').on('click', function(e) {
alert('you clicked on employee ' + ko.contextFor(e.target).$data.name() +
' also known as ' + ko.dataFor(e.target).name());
});
});?
Run Code Online (Sandbox Code Playgroud)
您可以使用Knockout点击绑定,而不是使用jQuery绑定click事件,该绑定将当前模型数据作为第一个参数传递,将事件作为第二个参数(jsfiddle)传递:
function EmployeeViewModel() {
var self = this;
// skipped some of your code
this.clickedOnEmployee = function(model, event) {
// assuming your Employee has a name observable
alert('You clicked on employee ' + model.name());
};
}
Run Code Online (Sandbox Code Playgroud)
在您的html中($ root是您的基本视图模型,如果您的clickedOnEmployee函数在您的Employee对象上,则不需要它):
<ul data-bind="foreach: employees">
<li>
<span data-bind="text: name"></span>
<button data-bind="click: $root.clickedOnEmployee">show</button>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
40002 次 |
最近记录: |