[英]Scope of function in ViewModel
我试图从ClickModel中调用一个来自click事件的函数。 当我从foreach循环中调用它时,该函数似乎超出了范围。 JavaScript的新手,并试图围绕如何/为什么被证明是徒劳的。
功能:
$dyn.controls.Test = function (props, element) {
var self = this;
$dyn.ui.Control.apply(this, arguments);
$dyn.ui.applyDefaults(this, props, $dyn.ui.defaults.Test);
self.RowItem = [
{
.
.
.
}];
self.Periods = [
{ Label: "13:00", Open: true },
{ Label: "13:10", Open: true },
.
.
.
{ Label: "14:30", Open: true }];
self.clickedMe = function (action) { //This is the function I want to call
alert("Clicked");
};
.
.
.
在HTML中,这适用于:
<div data-dyn-bind="foreach: $data.RowItem" class="table" id="workspace">
<div class="row">
<div class="resourceCell" data-dyn-bind="attr: {id: $data.Id}">
<div data-dyn-bind="text: $data.Id" class="resourceCell_inner"></div>
</div>
<div class="periodRow" data-dyn-bind="foreach: $parent(0).Periods, click: function(event) {$parent(0).clickedMe(event);}">
<div class="periodCell"></div>
</div>
</div>
</div>
这不是:
<div data-dyn-bind="foreach: $data.RowItem" class="table" id="workspace">
<div class="row">
<div class="resourceCell" data-dyn-bind="attr: {id: $data.Id}">
<div data-dyn-bind="text: $data.Id" class="resourceCell_inner"></div>
</div>
<div class="periodRow" data-dyn-bind="foreach: $parent(0).Periods">
<div class="periodCell" data-dyn-bind="click: function(event) {$parent(0).clickedMe(event);}"></div>
</div>
</div>
</div>
但是,我显然希望从“单元格”div而不是行调用我的函数。 有什么建议?
一旦你进入另一个foreach
循环的范围, $parent
关键字不再引用你认为它的对象( $root
),而是引用Periods
数组。
每当你知道你所指的function
/ property
是在根视图模型上时,你应该使用$root
代替:
<div class="periodCell"
data-dyn-bind="click: function(event) { $root.clickedMe(event); }"></div>
第一个clickedMe
,因为范围相同,但在循环中,每个迭代都表示为$data
,这可能没有clickedMe
属性。 你可以尝试使用
$parent.$parent(0).clickedMe(event);
这里$parent
将指向初始范围,然后您可以使用$parent(0)
转到其父级。
而且,而不是
click: function(event) {$parent(0).clickedMe(event);}
你可以试试
click: $parent(0).clickedMe
event
自动添加为参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.