3

私はEmber 1.11でEmber-cliを使用しています

コントローラーで transitionToRoute メソッドを使用してルートに遷移し、動的に生成されたオブジェクトをモデルとしてフィードしようとしています。

これが私のコントローラーです:

import Ember from 'ember';

export default Ember.Controller.extend({
  actions: {      
      launch_scanner: function(){
        console.log('launch_scanner');
        var model = {name: "Edward", phone: "123", email: "email@test.com"};
        //the final app will pull the model variable from a QR scanner

        this.transitionToRoute('addcontact', model);
     }
  }      
});

このアクションをトリガーすると、transitionToRoute メソッドによって次のエラーが発生します。

不明なエラー: ルートの動的セグメントよりも多くのコンテキスト オブジェクトが渡されました: addcontact

モデル パラメータを省略すると、addcontact ルートに問題なく遷移します。私は何を間違っていますか?

これが私のルーターファイルです:

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

Router.map(function() {
  this.route('home', {path: '/'});
  this.resource('addcontact', {path: '/addcontact'});
});

export default Router;
4

3 に答える 3

1

多くの Ember アプリケーションで発生する古典的な問題、つまり「新規」/「作成」状況を処理する方法を扱っています。

のようなルートを定義することはできません。

this.route('addcontact', { path: /addcontact/:thing_id }

新しい連絡先には ID がなく、サーバーに永続化されるまで ID がないため、その時点で新しい連絡先ではなくなります。

それでも、アプリケーションにはいくつかのポイントがあります。あなたの場合、ユーザーが「新しい連絡先」ボタンを押した「ホーム」ページで、何を作成するか、またはどのように作成するかについての有用な情報が含まれている可能性があります。 -- を使用してすぐにオブジェクトを作成したい場合でも、その情報または新しいレコードを、動的セグメントを持たないルートにthis.store.createRecordどのように渡すのでしょうか?addcontacdt

いくつかのアイデアが含まれます:

  1. ルートなどに新しい連絡先を作成homeし、コントローラーに保存します。次に、model新しいルートのフックで、 を使用して取得しthis.controllerFor('home').get('newContact')ます。

  2. を使用して、新しいオブジェクトを作成するために必要なパラメーターがある場合は、クエリ パラメーターaddcontactとしてルートに渡します。次に、フックで、または同等のものを使用して新しいオブジェクトを作成します。transitionTo('newcontact', queryParameters)modelthis.store.createRecord('contact', transition.queryParameters)

于 2015-06-15T19:46:41.370 に答える
0

保存されていないレコードのサブルートに移動する場合は、2 つのオプションがあります

ルートに移行する前にモデルを保存してください

model.save().then(function(result){
   self.transitionToRoute('route',result.id)
});

または、モデルを保存したくない場合は、createRecord でモデルの ID を生成します (ユーザーがキャンセルでき、削除を処理したくない場合があります)。

同一の ID の可能性が低い ID を作成するための基本的な関数は次のようになります。

generateIdForRecord: function() {
    var d = new Date().getTime();
    var uuid = 'xxxxyyyxxxxxxxxyyxyxxxyyy'.replace(/[xy]/g, function(c){
        var r = (d + Math.random() * 16) % 16 | 0;
        d = Math.floor(d / 16);
        return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16);
    });
    return uuid;
}

このアプローチを使用すると、まだ保存されていないモデルに遷移先の ID があります。モデルを保存すると現在の ID が無効になるため、そのルートからの遷移の処理について考えてみてください (モデルは応答でサーバーから実際の ID を取得します)。

于 2015-10-13T15:55:19.577 に答える
0

addContact ルートに動的セグメントがないため、これは正常です。ルーターを次のように変更する必要があります

Router.map(function() {
  this.route('home', {path: '/'});
  this.resource('addcontact', {path: '/addcontact/:id'});
});

これで、モデル全体ではなくモデル ID を渡してmodelフックをトリガーできるようになりました。または、モデル全体を渡すこともできますが、modelフックはトリガーされません。afterModelただし、フックでモデルを変更することはできます。

于 2015-06-15T19:21:35.283 に答える