单击更新子指令

时间:2018-02-24 07:48:20

标签: angularjs angularjs-directive

有没有办法在点击时更新子指令?在我的plnkr中,第1列包含一个名称列表。如果单击名称,它会将信息填充到第2列中的contact指令。如果我在第2列的文本框中进行了更改,则第3列中info指令中的数据也将也会更改。这是我的plnkr:

http://plnkr.co/edit/gcZbd9letYhA4ViBQJ0Q?p=preview

这是我的JS:

var app = angular.module('myApp', []);

app.controller('contactController', function() {

  this.contacts = [
      {
        id: 1,
        name: 'Bob'
      },
      {
        id: 2,
        name: 'Sally'
      },
      {
        id: 3,
        name: 'Joe'
      }
    ]

    this.selectedContact;

    this.PublishData = function(data) {
      this.selectedContact = data;
    }

    this.UpdateData = function(data) {
      for (var i = 0; i < this.contacts.length; i++) {
        if (this.contacts[i].id === data.id) {
          this.contacts[i] = angular.copy(data);
        }
      }
    }
});

app.directive('contactDirective', function () {
    return {
      restrict: 'E',
      templateUrl: 'contact.html',
      scope: {
        myModel: '=',
        updateData: '&'
      },
      link: function (scope, element, attrs) {

          scope.$watch('myModel', function (newValue, oldValue) {

            scope.contact = angular.copy(newValue);
          });
      }
    }
});

app.directive('infoDirective', function () {
    return {
      restrict: 'E',
      templateUrl: 'info.html',
      scope: {
        contactObject: '='
      },
      link: function (scope, element, attrs) {

      }
    }
});

1 个答案:

答案 0 :(得分:0)

你可以简单地使用$ broadcast和$ on services

使用$ broadcat创建一个事件并传递参数 用$ on你听那个事件并取这个值

我用这种方式编辑了你的代码:

        <!--Contact template-->
        <div class="col-sm-6">
          <b>Column 2</b>
          <input type="text" ng-model="newName" />
          <button ng-click="updateData({data:contact,newName:newName})">Update</button>
        </div>
        <div class="col-sm-6">
          <b>Column 3</b>
          <info-directive contact-object="contact"></info-directive>
        </div>

        <!-- Your Index file -->
      <body ng-app="myApp">
        <div ng-controller="contactController as $ctrl">
          <div class="row col-md-12">
            <div class="col-sm-2">
              <b>Column 1</b>
              <div ng-repeat="contact in $ctrl.contacts">
                <a href="" ng-bind="contact.name" ng-click="$ctrl.PublishData(contact)"></a>
              </div>
            </div>
            <div class="col-sm-6">
              <contact-directive my-model="$ctrl.selectedContact" update-data="$ctrl.UpdateData(data,newName)"></contact-directive>
            </div>
          </div>
        </div>
      </body>

    //and your controller
         var app = angular.module('myApp', []);

app.controller('contactController', function() {

  this.contacts = [
      {
        id: 1,
        name: 'Bob'
      },
      {
        id: 2,
        name: 'Sally'
      },
      {
        id: 3,
        name: 'Joe'
      }
    ]

    this.selectedContact;

    this.PublishData = function(data) {
      this.selectedContact = data;
    }

    this.UpdateData = function(data,newName) {
      for (var i = 0; i < this.contacts.length; i++) {
        if (this.contacts[i].id === data.id) {
          this.contacts[i].name = newName;
        }
      }
    }
});


app.directive('contactDirective', function () {
    return {
      restrict: 'E',
      templateUrl: 'contact.html',
      scope: {
        myModel: '=',
        updateData: '&'
      },
      link: function (scope, element, attrs) {

          scope.$watch('myModel', function (newValue, oldValue) {
            scope.newName = newValue.name;
            scope.contact = angular.copy(newValue);
          });
      }
    }
});

app.directive('infoDirective', function () {
    return {
      restrict: 'E',
      templateUrl: 'info.html',
      scope: {
        contactObject: '='
      },
      link: function (scope, element, attrs) {

      }
    }
});