13

コントローラーで $scope スープを回避するために controllerAs 構文を使用し、モーダル ビューを表示するために ui.bootstrap も使用しています。

現在のコントローラーと同じスコープを共有する modalInstace を開く必要があります。スコープを注入するときは、おそらく次のようなことができます。

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      scope: $scope
    });

ただし、スコープを挿入せず、controllerAs 構文を使用しているため、機能しません。

私が見つけたものから、データを渡すには resolve を使用する必要がありますが、関数を介して明示的に渡す必要があります。スコープ全体を渡す方法はありますか?

そのモーダルでやらなければならないことがたくさんあり、大量のデータを渡すのはやり過ぎのようです。

面倒だからやりたくない…

var modalInstance = $modal.open({
  templateUrl: 'myModalContent.html',
  controller: 'ModalInstanceCtrl',
  resolve: {
    user: function() {
        return vm.user;
    },
    something: function() {
        return vm.something;
    },
    blah: function() {
        return blah;
    }
  }
});

より良いアイデアはありますか?

4

2 に答える 2

15

現在のコントローラーと同じスコープを共有する modalInstace を開く必要があります。

モーダル サービスは、継承されたスコープを作成します。と

var modalInstance = $uibModal.open({
  templateUrl: 'addEditModal.html',
  scope: $scope
});

スコープを注入しませんが、モーダル コントローラーの親スコープを指定します (それ以外の場合は、ルート スコープが親として使用されます)。

controllerAs は親コントローラーで使用されたため、モーダル コントローラーはvmそのスコープで継承されたオブジェクトにアクセスできます。

于 2015-10-16T07:08:06.877 に答える
8

正しく理解できたかどうかはわかりませんが、resolve パラメーターに現在の「controllerAs」を渡す/挿入することで機能するようになりました

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      controller: 'AudioItemAddEditCtrl as vm',
      resolve: {
        parent: function(){
            return vm
        }
    }
    });

そして、AudioItemAddEditCtrl で...

var AudioItemAddEditCtrl = function(parent, AudioItemService, $ModalInstance) {
...
}

次に、「親」を使用して、親コントローラーのスコープに直接アクセスできます。

これが他の誰かに役立つことを願っています。

于 2015-10-17T03:34:30.410 に答える