控制器仍在$ state.go之后运行

时间:2016-08-09 07:22:07

标签: angularjs angular-ui-router state

我的问题是我需要在运行页面的Controller时进行快速验证检查,以检查查询参数是否有效。所以现在我这样做:

if (invalid params) {
    $state.go('state', {param: validParam}, {reload: true});
}

// Controller logic here to initialise the page

我期望的行为是,如果参数无效,整个Controller将使用有效参数重新加载,一切都很好。实际发生的是,即使在此$state.go行之后,Controller的其余部分仍会尝试运行。

我设法修复此问题的唯一方法是将Controller逻辑移动到else语句中,如下所示:

if (invalid params) {
    $state.go('state', {param: validParam}, {reload: true});
} else {
    // Controller logic here to initialise the page
}

这样可行,但我觉得将很多复杂的逻辑移到这个else语句中并不理想,我希望Controller停在$state.go并重新加载Controller ...因此为什么我使用reload: true

所以任何想法为什么没有按预期发生?

2 个答案:

答案 0 :(得分:4)

好吧,return是一个函数调用,它被执行,但不会停止进一步处理。如果我们在一个函数中,我们有控制流语句来停止执行,比如if (invalid params) { $state.go(‘state’, {param: validParam}, {reload: true}); return; }

var myFunction = function(){
    ...
    if (invalid params) {
        $state.go(‘state’, {param: validParam}, {reload: true});
        return;
    }
}
myFunction();

如果我们不在函数中......它是简单的JS操作集。我们应该将它们封装在这样的函数中:

class ButtonComboBox : public QComboBox
{
public:
    ButtonComboBox(QWidget *parent = nullptr)
        : QComboBox(parent),
          _isPopupShown(false),
          _timer(new QTimer(this))
    {
        auto lineEdit = new QLineEdit;
        lineEdit->installEventFilter(this);
        setLineEdit(lineEdit);

        _timer->setSingleShot(true);
        _timer->setInterval(100);
    }

protected:
    bool eventFilter(QObject *object, QEvent *event) override
    {
        if (object == lineEdit() && event->type() == QEvent::MouseButtonPress) {
            if (!_timer->isActive()) {
                if (!_isPopupShown)
                    showPopup();
                else if (_isPopupShown)
                    hidePopup();

                return true;
            }
        }

        return false;
    }

    void showPopup() override
    {
        QComboBox::showPopup();
        _isPopupShown = true;
        _timer->start();
    }

    void hidePopup() override
    {
        QComboBox::hidePopup();
        _isPopupShown = false;
        _timer->start();
    }

private:
    bool _isPopupShown;
    QTimer *_timer;
};

答案 1 :(得分:0)

您尝试过类似的事情吗?

$state.go($state.current, {param: validParam}, {reload: true});