AngularJS Modal中控制器之间的双向绑定

时间:2016-03-10 09:42:29

标签: javascript html angularjs

我的index.html包含一个可信的div和一个按钮。在按钮click(ng-click)上,$uibModal.open()控制器中的ModalDemoCtrl功能打开一个模态窗口,然后调用控制器ModalInstanceCtrl,在模态中呈现各种表情。我希望当我点击模态窗口中的笑脸时,图像会在contenteditable

中的index.html div中呈现

index.html

<div ng-controller="ModalDemoCtrl" id="angularData">
  <div id="view1">
      <button type="button" class="btn btn-default" ng-click="open('lg')">Emojis</button>
      <div contenteditable="true" ng-model="textModel"></div>
  </div>
</div>

emojis.js

angular.module('ui.bootstrap.demo')
.controller('ModalDemoCtrl', function ($scope, $uibModal, $log) {

  $scope.animationsEnabled = true;
  $scope.textModel = "Hello";

  $scope.open = function (size) {
    var modalInstance = $uibModal.open({
      animation: $scope.animationsEnabled,
      templateUrl: 'template/template.html',
      controller: 'ModalInstanceCtrl',
      windowClass: 'large-Modal',
    });
  };
});


angular.module('ui.bootstrap.demo')
.controller('ModalInstanceCtrl', function ($scope, $window, createEmojiIcon) {

  $scope.getUnicode = function(id) {  //This functions get the img tag of clicked smiley in variable 'input'
  var style = createEmojiIcon.createEmoji(icons[id]);
  var input = '<img src="img/blank.gif" class="img" style="' + style + '" alt="' + icons[id][3] + '" title="' + icons[id][3] + '">';
  }
});

我想要的是这个变量,在调用函数contenteditable时,在$scope.getUnicode div中称为输入。

简单来说,ModalDemoCtrl中的textModel在调用函数$scope.getUnicode时会附加img标记。

ps :函数$scope.getUnicodeng-click中的template.html调用

Here 是一个样本。

2 个答案:

答案 0 :(得分:2)

由于您有2个独立的范围,因此您需要为click事件进行rootScope广播。

修正了你的代码。通过$ rootScope广播将X从模型弹出窗口传递到其他控制器。

在ModalInstanceCtrl

$rootScope.$broadcast('selectedCode', {message: 'x'});

在ModalDemoCtrl

$rootScope.$on('selectedCode', function(event, args){
   alert(args.message);
});

https://plnkr.co/edit/YE3u8JEXJ4mABOPhUJyg

答案 1 :(得分:1)

亲爱的

您必须使用工厂或服务。但是,我会向你展示一些参考资料:

angular.module('ui.bootstrap.demo')

    .factory('myFactory', function() {
        return {
            setInput : function(data){
                input = data;
            }
            getInput : function(){
                return input;
            }  
        }
    });

    .controller('ModalDemoCtrl', function ($scope, $uibModal, $log) {
        $scope.input= myFactory.getInput();
        **//you'll get value what you set in controller below**
    });

    .controller('ModalInstanceCtrl', function ($scope, $window, createEmojiIcon){

        myFactory.setInput(data);
        **//you are setting value here**
    });

谢谢&amp;干杯