为了确保我正在访问当前视图,我可以这样做:
function attached(view, parent) {
$("#element",view).hide();
}
这将返回undefined
viewModel.selectedcategory.subscribe(function (data,view) {
console.log(data,view);
$("#element",view).hide();
});
所以我正在做的访问视图是,我定义了一个全局变量currentView
,如下所示:
var currentView,
viewModel = {
activate: activate,
attached: attached,
selectedcategory: ko.observable(false)
}
viewModel.selectedcategory.subscribe(function (callback) {
console.log(callback, activeView);// now i can access the view
$("#element",activeView).hide();
});
return viewModel;
function attached(view, parent) {
currentView = view; // update currentView
$("#element",view).hide();
}
有没有更好的方法来做同样的订阅,如
viewModel.selectedcategory.subscribe(function (subscribeView, subscribeParent) {
});
答案 0 :(得分:1)
无需参考"当前视图"你这样做的方式 - 基本上,你正在缓存它。
在attached
处理程序中,执行以下操作:
var $view = $(view);
然后,继续在该函数中使用$ view。
如果您倾向于缓存视图,那么您还没有充分模块化您的代码。例如,用于缓存视图的常见重构是创建自定义Knockout绑定。在您的情况下,您可以为hide()
创建一个简单的自定义Knockout绑定,您可以将其称为toggle()
:
ko.bindingHandlers.toggle = {
update: function(element, valueAccessor) {
// Initially set the element to be instantly visible/hidden depending on the value
var value = valueAccessor();
$(element).css('visibility', ko.unwrap(value));
}
};
使用这个绑定是微不足道的(我从我的代码中提取了这个):
<div class="ts-message__datetime">
<div class="ts-data--readonly" data-bind="toggle: showMessageDates(), text: messageBo().created(), css: cssClassSpeechBubbleDates()"></div>
</div>
所以,现在,不是缓存视图以便显示/隐藏,而是在viewModel上创建一个observable(在上面的例子中,我有一个名为showMessageDates
的observable,默认为隐藏):
var showMessageDates = ko.observable(false);
在viewModel中,只要您想要影响元素的显示/隐藏状态,只需更改可观察值即可。
更有针对性地回答你的问题,是的,有一种比订阅更好的方法:自定义Knockout绑定!