0

次の Rails HAML があります。

 = select_tag "some-class",
                        options_for_select([['None', '']], ''),
                        { class: 'some-other-class',
                          'ng-model' => 'someModel',
                          'ng-options' => 'option.name for option in someList',
                          'ng-change' => 'updateSelected()'}

角度コントローラー:

  scope.updateSelected = ->
       #logic for updating model lives here. Model updates successfully by using some values defined within scope. Includes the following:
       scope.someModel = "some_new_value"

角度ディレクティブ:

  SomeClassDirective= ->
       restrict: 'C'

       link: (scope, element, attrs) ->

            monitorFormFields = (newValue, oldValue) ->
                   console.log "this is the inner function call"
                   #logic for setting the inner _destroy field lives here

            scope.$watch 'someModel', monitorFormFields

ただし、選択リストの値が変更されると、「これは内部関数呼び出しです」は出力されません (ディレクティブが最初に初期化されるとき、つまりページの読み込み時に出力されます)。したがって、私の質問は次のとおりです: $watch 式がトリガーされないのはなぜですか?どうすればトリガーできますか?

ありがとう!

4

1 に答える 1

1

この HTML では:

<select class="some-class" ng-model="someModel" 
   ng-options="option.name for option in someList"></select>

への変更を監視するディレクティブを次に示しますsomeModel

myApp.directive('someClass', function () {
  return {
    restrict: 'C',
    link: function (scope, element, attrs) {
      var monitorFormFields = function (newValue, oldValue) {
        console.log("this is in the inner function call");
      }
      scope.$watch('someModel', monitorFormFields);
    }
  }
});

コントローラ:

$scope.someList = [{ name: 'name1' }, { name: 'name2' }];

更新するためにコントローラー メソッドを呼び出す必要がないことに注意してくださいsomeModel。Angular は、ng-model属性のために自動的にそれを行います。したがって、ディレクティブは、その $scope プロパティへの変更を $watch するだけで済みます。

フィドル


名前に [_destroy] を含む兄弟を要素からフェッチし、選択ボックスの値に応じて「0」または「1」に設定したいと思います。

よりAngularなアプローチは、モデルプロパティが「0」または「1」のどちらを表示するかを制御することです。たとえば、コントローラーで:

$scope.destroy1 = "0";
$scope.destroy2 = "0";

あなたのHTMLで:

<div>{{destroy1}}</div>
<div>{{destroy2}}</div>

monitorFormFields() では、これらのスコープ プロパティの値を変更でき、ビューは自動的に更新されます。兄弟を「検索」したり、.val()ues を更新したりする必要はありません。

于 2013-01-08T18:57:39.570 に答える