ember.js willTransition被调用两次

wooyq4lh  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(142)

**目标:**如果当前路线的模型已更改(即,用户已更新某些字段但未保存,即isDirty === true),则防止转换到另一路线。
**设置:**我使用的代码与EmberJS.com's Routing guide中的代码几乎完全相同。

export default Ember.Route.extend({
  actions: {
    willTransition(transition) {
      if (this.controller.get('userHasEnteredData') &&
          !confirm("Are you sure you want to abandon progress?")) {
        transition.abort();
      } else {
        // Bubble the `willTransition` action so that
        // parent routes can decide whether or not to abort.
        return true;
      }
    }
  }
});

在我的控制器中,userHasEnteredData只是一个计算属性,它监视模型的isDirty属性。

**问题:**当我从confirm框中选择取消时(即“取消过渡以便我可以完成编辑”),确认框再次弹出。再次取消会使它永远消失,但我不知道为什么它会被点击两次。如果我第一次在确认框中说“确定”,它会继续进行过渡,而不会再次弹出确认框。只有在第一次取消时,它才会立即再次弹出。

我试着在www.example.com上复制ember-twiddle.com,但是它在那里运行得很好,只调用了willTransition一次。如果它在我的代码中确实被调用了两次,我也不知道为什么,因为我已经检查了又检查了两次,我看不到任何不同的地方会导致在transition.abort()运行后再次调用钩子。
有线索吗?

EDIT我进一步简化了willTransition,它仍然运行了两次。看起来transition.abort()调用了willTransition(),尽管这没有意义!

actions: {
    willTransition: function(transition) {
      console.log('trying to transition');
      transition.abort();
    }
  }
}
//logs 'trying to transition' to the console twice!
mrzz3bfm

mrzz3bfm1#

对于任何可能有类似问题的人:
我在调用transition.abort()(试图处理未保存的更改)时遇到了willTransition被触发两次的问题。
在我的例子中,这个问题与我从willTransition返回true这一事实有关(无论我是否处理未保存的更改)。
一旦我将return true;移到hasChangesif语句的else条件中,问题就解决了。

willTransition(transition) {
    if (this.controller.get(model.hasDirtyAttributes)) {
        // Handle unsaved changes...
        // ...then `transition.retry()`
    } else {
        return true; // <-- this worked
    }

    // return true; <-- this fired `willTransition` twice
}
x9ybnkn6

x9ybnkn62#

下面的解决方案对我很有效。willTransition不会被调用两次

willTransition(transition) {
  if (this.controller.get('model.hasDirtyAttributes') && !confirm("Are you sure you want to abandon progress?")) {
    transition.abort();
  } else {
    this.controller.get('model').rollbackAttributes();
  }
}

相关问题