0

環境:

私はAngularui-routerを使用しています...

テンプレート「ParentTempl 」を持つ親コントローラー「ParentCtrl 」があります。

ParentTempl 内には、addeditの 2 つの状態のビューがあります。

アクティブな状態に基づいて動作を変更するParentCtrl " abstractUpdate "から関数を呼び出したい。

現在のコード:

app.config(function($stateProvider, $urlRouterProvider) {
    $stateProvider
    .state('add', {
        template: "...", 
        abstractUpdate = function(object){
            // do add things
        }
    })
    .state('edit', {
        template: "...", 
        abstractUpdate = function(object){
            // do edit things
        }
    });
}

app.controller('ParentCtrl', function ($scope, $state) {
    $scope.click = function(obj){
        $state.current.abstractUpdate(obj);
    }
}

質問:

現在のバージョンは動作していますが、それが最善の解決策だと思いますか? 助言がありますか?

4

2 に答える 2

0

通常、このようなものにはファクトリーまたはサービスを使用します。そうすれば、ルーティングがアプリケーション ロジックで詰まることはありません。ファクトリ/サービスに注入するだけ$stateで、現在の状態に基づいて物事を処理できます。

angular.module('myApp').factory('MyService', [
    '$state',
    function ($state) {
      return {
        myMethod: function (obj) {
          if (this.hasOwnProperty($state.current.name)) {
            this[$state.current.name](obj);
          }
        },
        add: function (obj) {
          // do stuff
          return obj;
        },
        edit: function (obj) {
          // do stuff
          return obj;
        }
      }
    }
]);

これで、任意のコントローラーからサービスを使用できるようになりました。注入するだけです。

 angular.module('myApp').controller('myController', [
     '$scope',
     'MyService',
     function ($scope, MyService) {
         $scope.obj = {};
         $scope.obj = MyService.myMethod(obj);
     }
 ]);
于 2015-03-10T01:20:57.033 に答える
0

それぞれが別々のタスクを実行する 2 つの別々の関数を用意する方がより明確になります。それはより良いプログラミングの習慣です、imo。

子ビューごとにコントローラーを作成し、それぞれParentCtrlの親として持つことができます。各子コントローラーは、親の「edit」または「new」メソッドを呼び出す独自のクリック ハンドラーを持つことができます (各子コントローラーにコード全体または一部を配置する方が理にかなっている場合を除きます)。

于 2015-03-10T00:53:39.797 に答える