95

ビューをロードするときに、関連するコントローラーで初期化コードを実行したいと考えています。

そのために、ビューのメイン要素で ng-init ディレクティブを使用しました。

<div ng-init="init()">
  blah
</div>

そしてコントローラーで:

$scope.init = function () {
    if ($routeParams.Id) {
        //get an existing object
        });
    } else {
       //create a new object
    }

    $scope.isSaving = false;
}

最初の質問: これは正しい方法ですか?

次に、発生する一連のイベントに問題があります。ng-disabledビューには、ディレクティブをそのまま使用する「保存」ボタンがあります。

<button ng-click="save()" ng-disabled="isClean()">Save</button>

isClean()関数はコントローラーで定義されます。

$scope.isClean = function () {
    return $scope.hasChanges() && !$scope.isSaving;
}

ご覧のとおり$scope.isSaving、関数で初期化されたフラグを使用していinit()ます。

問題: ビューが読み込まれると、関数の前にisClean 関数が呼び出されるinit()ため、フラグisSavingundefinedです。それを防ぐにはどうすればよいですか?

4

4 に答える 4

17

または、コントローラーでインラインで初期化することもできます。コントローラーの内部で init 関数を使用する場合、スコープで定義する必要はありません。実際、それは自己実行することができます:

function MyCtrl($scope) {
    $scope.isSaving = false;

    (function() {  // init
        if (true) { // $routeParams.Id) {
            //get an existing object
        } else {
            //create a new object
        }
    })()

    $scope.isClean = function () {
       return $scope.hasChanges() && !$scope.isSaving;
    }

    $scope.hasChanges = function() { return false }
}
于 2013-04-22T19:41:14.120 に答える
14

プロジェクトで次のテンプレートを使用します。

angular.module("AppName.moduleName", [])

/**
 * @ngdoc controller
 * @name  AppName.moduleName:ControllerNameController
 * @description Describe what the controller is responsible for.
 **/
    .controller("ControllerNameController", function (dependencies) {

        /* type */ $scope.modelName = null;
        /* type */ $scope.modelName.modelProperty1 = null;
        /* type */ $scope.modelName.modelPropertyX = null;

        /* type */ var privateVariable1 = null;
        /* type */ var privateVariableX = null;

        (function init() {
            // load data, init scope, etc.
        })();

        $scope.modelName.publicFunction1 = function () /* -> type  */ {
            // ...
        };

        $scope.modelName.publicFunctionX = function () /* -> type  */ {
            // ...
        };

        function privateFunction1() /* -> type  */ {
            // ...
        }

        function privateFunctionX() /* -> type  */ {
            // ...
        }

    });
于 2015-06-05T11:31:25.123 に答える