代码之家  ›  专栏  ›  技术社区  ›  Beatles1692

为什么ng change不处理angularjs中的自定义指令[duplicate]

  •  0
  • Beatles1692  · 技术社区  · 7 年前

    我正在研究一个select指令,该指令知道其存储库并加载其数据。

    <select></select>
    

    我有一个编译函数,它向select添加了一个ng options指令。

    这里还有一个相同代码的plunker版本: https://plnkr.co/edit/D8lErJWKZyrAeI6BZ7iJ

    // Code goes here
    
    var app = angular.module("myShoppingList", []); 
    app.controller("myCtrl",['$scope','productsRepository', function($scope,productsRepository) {
        $scope.products =productsRepository.getAll();
        $scope.selectdProduct={};
        $scope.onSelectedProductChanged=function(item){
          alert(item);
        }
    }]);
    
    app.service("productsRepository",[function(){
      return {
        getAll:function(){return [
          {
            id:1,title:'Milk'
          },
          {
            id:2,title:'Bread'
          },
          {
            id:3,title:'Cheese'
          }
          ]}
      }
    }]);
    
    app.directive("productsComboBox",['$compile','productsRepository',function($compile,productsRepository){
      return {
        restrict:'E',
        replace:true,
        template:'<select></select>',
        scope:{
          ngModel:'='
        },
        require:'ngModel',
        compile:function(elm,atts){
          elm.attr('ng-options','item.id as item.title for item in items' );
          var fn=$compile(elm);
          return function(scope,elm,atts){
            
              fn(scope);
              scope.items=productsRepository.getAll();
              console.log(scope.items);
          }
        }
      }
    }])
    <!DOCTYPE html>
    <html>
    
      <head>
        <script data-require="angular.js@*" data-semver="4.0.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.10/angular.min.js"></script>
        <script data-require="angular.js@*" data-semver="4.0.0" src="script.ts"></script>
        <script data-require="angular.js@*" data-semver="4.0.0" src="system.config.js"></script>
        <script data-require="angular.js@*" data-semver="4.0.0" src="tsconfig.json"></script>
        <link rel="stylesheet" href="style.css" />
        <script src="script.js"></script>
      </head>
    
      <body ng-app='myShoppingList' ng-controller='myCtrl'>
        <ul>
          <li ng-repeat='product in products'>{{product.title}}</li>
        </ul>
        <products-combo-box ng-model='selectdProduct' ng-change='onSelectedProductChanged(selectdProduct)'></products-combo-box>
      </body>
    
    </html>

    1 回复  |  直到 7 年前
        1
  •  0
  •   john doe    7 年前

    尝试使用 $scope.$watch 而不是 ng-change

    $scope.$watch('selectdProduct', function (item) {
        alert(item);
    });