1

Ember アプリからの小さな抜粋がここにあります。マイページには、それぞれが独自のコントローラーを持つ異なるデータを含む多数のビューが含まれています。

stationList ビューのコンテンツを更新するために、stationList コントローラーと「対話」する必要がある 1 つのビューに検索フィールド (インデックス ビュー内) を配置する必要があります。これはうまくいきません。エラーが表示されます: TypeError: this.get(...).search は関数ではありません

ログには、使用するように依頼したコントローラーの名前が出力されます: App.StationListController

StationList ビューの内部に 2 つ目の検索フォームを追加しました。これはうまく機能します。今回のロギングは、StationListController オブジェクトのダンプを出力します。したがって、私のコード (SearchFormView 内): controllerBinding : 'App.StationListController' にもかかわらず、他の検索フォームがコントローラーを正しく設定していないと推測しています。

だから私は私の質問はなぜだと思いますか?

あるビューのフォーム フィールドの変更をルーティングして、別のビューのコントローラーで関数を呼び出すにはどうすればよいですか?

これが私のコードです:

<script type="text/x-handlebars" data-template-name="application">
    {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="index">
    <div id="searchForm">search form view search: 
        {{#view App.SearchFormView}}
            {{view App.StationSearchField}}
        {{/view}}
    </div>

    <div id="stationList">{{render stationList}}</div>
</script>

<script type="text/x-handlebars" data-template-name="stationList">
    station list view search: {{view App.StationSearchField}}
    <ul>
        <li>List</li>
        <li>will</li>
        <li>go</li>
        <li>here</li>
    </ul>
    {{searchTerm}}
</script>

App = Ember.Application.create({})

App.SearchFormView = Ember.View.extend({
    init : function()
    {
        console.log("SearchFormView init", this.get('controller'))
    }
})

App.StationSearchField = Ember.TextField.extend({
    keyUp: function(event) {
        var searchTerm = this.value

        console.log("value",searchTerm,this.get('controller'))

        this.get('controller').search(searchTerm)
    }
})

App.StationListController = Ember.ArrayController.extend({
    content     : [],
    searchTerm  : null,

    search : function(term)
    {
        this.set("searchTerm",term)
        console.log("searching",term)
    }
});

フィドル: http://jsfiddle.net/ianbale/8QbrK/14/

4

1 に答える 1

0

古いバージョンのものだと思いますが、controllerBindingもう機能していないと思います。

controllerForで使用できますget('controller')StationSearchField

    this.get('controller').controllerFor('station_list').search(searchTerm)

ただしcontrollerFor、非推奨であり、削除される可能性があります。needsコントローラーで使用するアプリケーション構造に応じて。

私が使用している別の方法は、ビューからカスタム イベントを送信することです。これは、ルートが対応するコントローラーに送信します。

App.IndexRoute = Ember.Route.extend({
    events: {
      search: function(term) {
        controller = this.controllerFor('station_list')
        controller.search(term);
      }
    }
});

そのようにビューから検索イベントをディスパッチします。

    this.get('controller').send('search', searchTerm);

この方法の利点は、複数の場所から同じイベントをディスパッチし、同じ方法で処理されることです。

これが更新されたjsfiddleです。

于 2013-06-26T09:38:38.513 に答える