2

ここで素朴な疑問。私はこの時計を持っています:

// Watch our model
$scope.$watch(function () {

    // Watch our team name
    return self.model.team.data.name;
}, function (name) {

    console.log(name);

    // if we have a name
    if (name) {

        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
    }
});

チーム モデルはデータベースからプロミス (したがってデータ) として取り込まれるため、ウォッチが最初に起動したときはself.model.teamが設定されていないため、null になります。時計が設定されるまで待機するか、時計のリターン機能にチェックを追加するにはどうすればよいですか?

4

2 に答える 2

2

関数の代わりにウォッチ式を使用します。これにより、オブジェクトが欠落しているエラーがキャッチされ、 が返されundefinedます。

// Watch our model
$scope.$watch('self.model.team.data.name', function (name) {

    console.log(name);

    // if we have a name
    if (name) {

        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
    }
});
于 2015-04-19T21:55:23.430 に答える
1

ここには魔法はありません。アクセスしている変数の 1 つが / である可能性があるnull場合undefined、それが / である場合、そのプロパティを取得できませnullundefined。したがって、それを防ぐ必要があります。

$scope.$watch(
  function(){
    return (self.model.team && self.model.team.data.name) || undefined;
  }, 
  function(v){
    // ...
  });

唯一の「魔法」は、式を「$watch」するときですが、式はスコープで公開する必要があります。したがって、次のことができます。

$scope.model = self.model;
$scope.$watch("model.team.data.name", function(v){
  // ...
});

しかし、実際には、そもそもなぜ$watchここが必要なのか自問する必要があります。非同期で一度取得しているように思えますteam-おそらく別の非同期呼び出しを除いて変更されるようには見えません。したがって、次のなしでデータを受信したときにそれを処理するだけです$watch:

someSvc.getTeam() // I made an assumption about a service that pulls the data from db
  .then(function(team){
     var name = team.data.name;

     // if we have a name
     if (name) {
        // Store our model in the session
        sessionStorage.designer = angular.toJson(self.model);
     }
  });

不要な$watchものはコストがかかります。ダイジェスト サイクルごとに評価されるため、$watcher の数を減らすのが最善です。

于 2015-04-20T05:02:18.907 に答える