0

Breeze と Angular で MVC 4 を使用しています。

いくつかのドメイン モデルを作成しましたが、モデルのリストのみを表示したいと考えています。これは私のコードです:

APIコントローラー:

[BreezeController]
public class TournamentApiController : ApiController
{
    private EFContextProvider<TournamentContext> _contextProvider;

    public TournamentApiController()
    {
        _contextProvider = new EFContextProvider<TournamentContext>();
    }

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpGet]
    public IQueryable<Tournament> Tournaments()
    {
        return _contextProvider.Context.Tournaments;
    }

    // ~/breeze/todos/SaveChanges
    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }
}

DataService.js:

/* dataservice: data access and model management layer */
app.dataservice = (function (breeze) {

    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

    var serviceName = '/breeze/TournamentApi'; // route to the same origin Web Api controller

    // *** Cross origin service example  ***
    //var serviceName = 'http://todo.breezejs.com/breeze/todos'; // controller in different origin

    var manager = new breeze.EntityManager(serviceName);
    // manager.enableSaveQueuing(true);

    var dataservice = {
        getAllTournaments: getAllTournaments,
        createTournament: createTournament,
        saveChanges: saveChanges,
    };
    return dataservice;

    /*** implementation details ***/
    function getAllTournaments() {
        var query = breeze.EntityQuery
                .from("Tournaments");

        return manager.executeQuery(query).then(getAllSucceeded);
    }

    function getAllSucceeded(data) {
        debugger;
        return data.results;
    }

    function createTournament(name) {
        return manager.createEntity('Tournament', { Name: name });
    }

    function saveChanges() {
        return manager.saveChanges().fail(fail);
    }

    function fail(error) {
        console.log = error;
        debugger;
    }
})(breeze);

そして私の角度コントローラー:

$scope.getAllTournaments = function () {
    dataservice.getAllTournaments().then(getAllSucceeded);
}

function getAllSucceeded(data) {
    debugger;
    if (data.length > 0)
        $scope.tournaments = data;
    else
        $scope.tournaments = [];
}

$scope.getAllTournaments();

クライアント側では、DB に格納されている 4 つのオブジェクトを確認できます。ただし、リストには次のようなオブジェクトが含まれています。

0: e.dataType
1: e.dataType
2: e.dataType
3: e.dataType

このようなオブジェクトを展開すると、次のように表示されます。

_backingStore: Object
entityAspect: o
__proto__: Object1

_backingStore をさらに展開すると、次のように表示されます。

Date: Mon Jan 01 1900 00:00:00 GMT+0100 (W. Europe Standard Time)
Id: 1
Name: "123"

もちろん、これは私が必要とするものです。

e.dataType._backingStoreリストを反復するときにクライアントコードで使用すべきではないと思うので、何か間違ったことをしていると感じています。

パス全体ではなく、プロパティ名だけを呼び出すにはどうすればよいですか?

4

1 に答える 1

2

Angular アプリが失敗している、バインディングが失敗している、または を書いたときに値を取得できないとは言いませんでしたaTournament.name。それはすべてうまくいきますよね?

そうではありません、教えてください。

あなたが求めているのは、デバッガーでエンティティを調べたときに表示される値の説明だと思います。

まず、いいえ、直接参照するべきではありません_backingstore... ever 。名前の「_」は立ち入り禁止であることを示しています。

何が起こっているのかを説明する前に、 についてお尋ねしますe.dataType._backingStore。見たことがないe; 見たことがないe.dataType。使用している 4 つのデバッガー (Chrome、IE10、FF、Visual Studio 2012) のいずれでも再現できません。デバッグしているブラウザを教えてください。答えはそこにあると感じています。

しかし、話を戻します...

これらのエンティティがデバッガーで少し奇妙に見えるのは事実です。それらはすべて、多かれ少なかれ次のようなプロパティ リストを表示します。

_backingStore: オブジェクト
エンティティアスペクト: ctor
__proto__: オブジェクト

あなたのエンティティ プロパティは明らかに消えました。彼らはどこに行きましたか?これはどのように機能しますか?それでもそうです!Angular のサンプル アプリをお試しになったことは間違いありません。彼らは正しく働きましたか?たとえば、Todo の説明が表示されました。

はい、ドリルダウンすると見つかります_backingStore。しかし、Angular はそれを行っていません。そして、あなたもそうすべきではありません

謎に対する答えは、これらの Breeze エンティティが ECMA Script 5 の「定義済みプロパティ」で構築されていることです。エンティティ プロパティは、Breeze ロジックを内部に持つゲッターとセッターを使用して定義されたプロパティとして実装されます。

何らかの理由で、デバッガーは定義済みのプロパティを一覧表示しません。リストにプロパティは表示されませんaTournament.nameが、読み取りと設定は問題なく実行できます。それがAngularが行っていることです。そして、あなたもそうすべきです。

FireBug デバッガー (FireFox 用) は、定義されたプロパティを明らかにするよりも優れた仕事をします。このスナップショットでは、最初のエンティティを選択してピリオドを入力しました。FireBug は、エンティティ プロパティ (ID、説明など) を含む私の選択を明らかにします。

FireBug の Breeze/Angular エンティティ

覚えておくべきことは、エンティティ プロパティが実際にそこにあり、期待どおりの方法でコーディングできるということです。デバッガーにだまされてはいけません。

古いブラウザ (IE8 など) を使用している場合、これは当てはまりません。古いブラウザは定義済みのプロパティをサポートしておらず、Angular+Breeze はそれらで動作しません。これらのブラウザーが本当に重要で、Breeze を使用したい場合は、Knockout などの代替モデル ライブラリを検討してください ( Angular+Breeze に匹敵するフル スタックについてはHotTowelを参照してください)。

于 2013-05-28T06:02:16.770 に答える