2016-08-22 4 views
2

だから私は2店舗、AuthorStoreありますAuthorStore.author.nameがnullであるかのように私は、それがnullのプロパティを取得することができないというBookStoreでエラーを取得しておくMobX - あるストアのコンストラクタを別のストアに実行しますか?

import AuthorStore from 'authorStore'; 
class BookStore { 
    @observable book = { 
    authorName: AuthorStore.author.name, 
    bookTitle: null 
    } 
} 

class AuthorStore { 
    constructor() { 
     // has author.name and is always present in storage 
     AsyncStorage.getItem('author').then(action((data) => { 
     this.author = JSON.parse(data); 
     })); 
    } 

    @observable author = null; 
} 

BookStoreを。したがって、最初にコンストラクタを実行して値を代入することなく、AuthorStoreからデフォルトのauthorの値を読み取っています。

AuthorStoreコンストラクタによって割り当てられた値をBookStoreauthorにするにはどうすればよいですか?

+0

コンストラクタはおそらくあなたの 'AuthStore'で意図したとおりに動作していますが、操作は非同期です。その結果、' AuthorStore.author'と 'AuthorStore.author.name'は' BookStore'。また、 'AuthorStore.author.name'を書くと、値を逆参照しています。 [プリミティブはそのようには見えません](https://mobxjs.github.io/mobx/best/pitfalls.html#dereference-values-as-lately-as-possible)ので、あなたがそれを必要とするまで、 'AuthorStore.author'を呼び出します。 – Tholle

+0

hmm ...コンストラクタの非同期操作のために返される値が 'null'であることを理解していますが、' BookStore'に値を取得する方法がまだわかりません – Wonka

答えて

2

あなたはgetItem('author') -promiseへの参照を格納し、あなたが本屋で何を行う前に、それが満たされていることを確認できます。

// authorStore.js 
class AuthorStore { 
    @observable author = null; 
    getAuthorPromise = null; 

    constructor() { 
    this.getAuthorPromise = AsyncStorage.getItem('author').then(action((data) => { 
     this.author = JSON.parse(data); 
    })); 
    } 
} 

export default new AuthorStore(); 

// bookStore.js 
class BookStore { 
    @observable book = null; 

    constructor() { 
    authorStore.getAuthorPromise.then(action(() => 
     this.book = { 
     authorName: authorStore.author.name, 
     bookTitle: null 
     }; 
    )); 
    } 
} 

また、あなたはどのストアを作成する前に、著者を取得し、与えることができますAuthorStoreコンストラクタの著者は、あなたがあなたのBookStore同期作成することができます。

// AuthorStore.js 
class AuthorStore { 
    @observable author = null; 

    constructor(author) { 
    this.author = author; 
    } 
} 

export default AuthorStore; 

// BookStore.js 
class BookStore { 
    @observable book = null; 
    authorStore = null; 

    constructor(authorStore) { 
    this.authorStore = authorStore; 
    this.book = { 
     authorName: authorStore.author.name, 
     bookTitle: null 
    }; 
    } 
} 

export default BookStore; 

// app.js 
import AuthorStore from './AuthorStore'; 
import BookStore from './BookStore'; 

AsyncStorage.getItem('author').then(data => { 
    const author = JSON.parse(data); 
    const authorStore = new AuthorStore(author); 
    const bookStore = new BookStore(authorStore); 
})); 

はそれを行うための方法がたくさんあることに留意してください。

+0

ありがとうTholle for help :)ストアを作成する前に著者を取得するという2番目のステートメントはおそらく最もクリーンなオプションであると思って、それを 'AuthorStore'コンストラクタに渡して、' BookStore'を同期的に作成することができます。どのように見えるだろうか?私はローカルにしようとしていますが、 'ヌルのプロパティ名を読み取ることができません。 'を受け取りました。 – Wonka

+0

@Wonkaこれを行う方法の1つで答えを更新しました:) – Tholle

+0

ありがとうTholle! – Wonka

関連する問題