4

これは機能します:

function DetailsCtrl($scope, Plan){
    $scope.entities = Plan.query();
}

これはしません:

function DetailsCtrl($scope){
    var injector = angular.injector(['myApp.services']);
    var name = 'Plan';
    var Entity = injector.get(name);

    $scope.entities = Entity.query();
}

2番目のケースでは、エラーはスローされず、console.log($ scope.entities)はロードされたエンティティをダンプします。ただし、変数はテンプレートにレンダリングされません。$ scopeに変数が入力される前に、テンプレートがロードされていると思います。もしそうなら、どうすれば$ scopeにvarsが時間内にロードされるようにできますか?

4

2 に答える 2

5

リソースを動的にロードするサービスを作成しました。

サービス:

var m = angular.module('myApp.services', ['ngResource']).
    factory('Entity',function($resource){
        return {
            Plan: $resource('/api/plans/:id',{id: '@id'})
        }
    }).
  value('version', '0.1');

コントローラ:

function DetailsCtrl($scope, Entity){
    $scope.entities = Entity['Plan'].query();
}
于 2012-09-10T21:30:27.210 に答える
1

はい、そうです。スコープがリソースまたはhttp呼び出しからデータをフェッチすることが期待されるかどうかに関係なく、Angularテンプレートがロードされます。私の理解では、Angularは$ scope変数をリッスンするか、いくつかの魔法のメソッドでテンプレートレンダリングのリロードをトリガーします。

この状況では、おそらくangularは、共有リソースサービス(プランモデル)が渡されていることを認識しており、データのフェッチに使用されることを期待しています。2番目の例では、Angularは、内部で別のサービスを使用する予定であるという手がかりを持っていないため、コールバックを準備したり、$scope変数の操作をチェックしたりしません。

何らかの理由で$scope変数に値を設定し、Angularが変更に気付かない場合は、テンプレートをすぐに更新して、次のように呼び出すことができます。

$scope.$digest(); //or $scope.$apply();

唯一の問題は、すでにダイジェスト操作を実行しているときに呼び出すと、スローされてエラーになることです(ステートメントの周りでtry / catchブランチを使用するだけです)。

それが機能しない場合は、テンプレート自体に式の適切な構文があることを再確認する必要があります。

于 2012-09-10T05:07:36.093 に答える