有没有更好的方法从订阅回调访问durandal当前视图?

时间:2014-08-01 17:20:04

标签: knockout.js durandal

为了确保我正在访问当前视图,我可以这样做:

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) {


});

1 个答案:

答案 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绑定!

相关问题