2013-04-05 3 views
14

Пожалуйста, обратитесь к этой скрипке для вопросов. http://jsfiddle.net/AQR55/

1) Почему часы, прикрепленные к свойству изоляционной области видимости, двунаправленно привязанные к родительскому свойству, не запускают изменение свойства родительской области.

В скрипке часы, показанные ниже, не срабатывают при изменении свойства родительской области, к которому он привязан.

$scope.$watch('acts', function(neww ,old){ 
        console.log(neww) 
       }) 

2) ng-click="addaction()" addaction="addaction()". Может ли этот код быть более элегантным? Поскольку для выполнения действия в изолированной области видимости нам нужно установить двунаправленную привязку и привязать к ng-click.

3) Могу ли я объявить методы в изолированном объеме, как показано ниже? Если мне это нравится, я получаю ошибку .js.

<isolate-scope-creating-cmp ng-click="isolateCmpClickHandler()"></isolate-scope-creating-cmp> 
scope:{ 
    isolateCmpClickHandler:function(){ 
     //If i do like this, I'm getting .js error 

    } 
} 
+0

, почему используется вторая точка? –

+0

Я хочу настроить обработчик событий для кнопки. Как упоминалось в третьем пункте, так как я не могу установить обработчик кликов внутри области выделения, мне пришлось сделать одну из функций, определенных в родительской области, как обработчик кликов. Для этого я использую '&' для оценки 'addaction()' в родительской области и im, используя это свойство оценки родительской области как обработчик кликов, используя 'ng-click'. Если я удалю 'addaction =" addaction() "' 'ng-click' не работает. Сценарий, который вы обновили для вопроса №. 1 не запускает watch onclick кнопки. Пожалуйста, загляните в firebug. – rajkamal

ответ

20

Вопрос 1.
Поскольку вы добавляете элемент в acts массива, вам необходимо установить третий параметр в $watch() к истинному

$scope.$watch('acts', function (neww, old) { 
    console.log(neww) 
}, true); 

Demo: Fiddle

Вопрос 2 .
Поскольку существует изолированный объем, вам необходимо вызвать функцию области $parent

<input type="button" bn="" acts="acts" ng-click="$parent.addaction()" value="Add Action" /> 

Демо: Fiddle

Вопрос 3.
Да, вы можете, но вы должны использовать контроллер

animateAppModule.directive('bn', function() { 
    return { 
     restrict: "A", 
     scope: { 
      acts: '=' 
     }, 
     link: function ($scope, iElement, iAttrs) { 
      $scope.$watch('acts', function (neww, old) { 
       console.log(neww) 
      }, true) 
     }, 
     controller: function($scope){ 
      $scope.dosomething = function(){ 
       console.log('do something') 
      } 
     } 
    } 
}) 

Демо: Fiddle

Общее решение может выглядеть следующим образом

<input type="button" bn="" acts="acts" addaction="addaction()" value="Add Action" /> 

JS

animateAppModule.controller('tst', function ($scope) { 
    $scope.acts = []; 
    $scope.addaction = function() { 
     $scope.acts.push({ 
      a: "a,b" 
     }) 
    } 
}) 

animateAppModule.directive('bn', function() { 
    return { 
     restrict: "A", 
     scope: { 
      acts: '=', 
      addaction: '&' 
     }, 
     link: function ($scope, iElement, iAttrs) { 
      $scope.$watch('acts', function (neww, old) { 
       console.log(neww) 
      }, true); 
      iElement.click(function(){ 
       $scope.$apply('addaction()') 
      }) 
     } 
    } 
}) 

Демонстрация: Fiddle

+2

, так как изменение углового монитора происходит с использованием угловых.элементов, которые используют === operator, поэтому для просмотра сложных объектов, таких как массив, вы должны передать true с выражением watch для сравнения для равенства объектов, а не ссылки –

Смежные вопросы