willTransition被调用两次

时间:2017-02-14 21:12:11

标签: ember.js

目标:如果当前路线的模型已更改(即用户已更新某些字段但未保存,即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框中取消时(即"取消转换以便我可以完成编辑"),然后再次弹出确认框。再次取消使它永远消失,但我不知道它为什么会被击中两次。如果我改为说" ok"在第一次确认时,它会继续并转换,而不会再次弹出确认。它只有在第一次取消时才会立即再次弹出。

我试图在ember-twiddle.com上复制,但它在那里工作正常,只调用willTransition一次。如果它确实在我的代码中被调用了两次,我就无法弄清楚为什么,因为我已经检查过并仔细检查了,而且我没有看到任何内容。在transition.abort()运行后会导致挂钩被再次调用的不同。

任何线索?

编辑我简化了willTransition,就这样,它仍然运行了两次。看来transition.abort()会调用willTransition(),但这没有任何意义!

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

2 个答案:

答案 0 :(得分:1)

对于可能遇到类似问题的任何人:

我遇到一个问题,willTransition在调用transition.abort()时被触发两次(试图处理未保存的更改)。

就我而言,问题出在以下两种情况下(无论我是否处理未保存的更改),我都从true返回了willTransition。我错误地认为transition.abort()就足够了。

一旦我将return true; hasChanges语句的if移到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
}

答案 1 :(得分:0)

以下解决方案对我有效。 Zip未被两次调用

willTransition