【问题标题】:AngularJS Two way binding between controllers in ModalAngularJS在Modal中控制器之间的两种方式绑定
【发布时间】:2016-03-10 09:42:29
【问题描述】:

我的index.html 包含一个可内容编辑的 div 和一个按钮。在按钮 click(ng-click) 上,ModalDemoCtrl 控制器中的 $uibModal.open() 函数打开一个模态窗口,然后调用控制器 ModalInstanceCtrl 在模态中呈现各种笑脸。我希望当我在模态窗口中单击笑脸时,图像会呈现在我的index.html 中的contenteditable 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] + '">';
  }
});

我想要的只是这个名为 input 的变量,以便在调用函数 $scope.getUnicode 时在 contenteditable div 中呈现。

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

ps:函数$scope.getUnicodeng-clicktemplate.html中调用

Here 是 plunker 示例。

【问题讨论】:

  • 你能做一个 plnkr 或 jsfiddle 吗?
  • 代码比较大,我尽量把plnkr里的代码都写下来。我对这一切都很陌生,如果可以,我会结帐!

标签: javascript html angularjs


【解决方案1】:

由于您有 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

【讨论】:

    【解决方案2】:

    亲爱的

    您必须使用工厂或服务。但我会向您展示工厂参考:

    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**
        });
    

    感谢和欢呼

    【讨论】:

    • 我认为你是用另一种方式做的,你在 ModalDemoCtrl 中设置输入并在 ModalInstanceCtrl 中获取它。我想要的是在 ModalInstanceCtrl 中设置输入并在 ModalDemoCtrl 中获取它。为此,我需要在 ModalDemoCtrl 中放置一个观察者,但后来我听说观察者会减慢您的 web 应用程序的速度,所以我避免使用观察者。我正在搜索是否可以获得一种双向绑定类型,只要输入获得一个值,它就会在 contenteditable div 中更新
    • 除非您发出事件通知父控制器该事件已发生,否则您的代码将无法工作。所以你必须使用工厂来存储数据 + $emit 来通知父级。
    • 我是 Angular Dhiren 的新手。当调用 getUnicode 时,我会检查是否可以执行 $emit 操作
    • 现在看 .. @isaksham ... 值将在 ModalInstanceCtrl 中设置,您将在 ModalDemoCtrl 中收到 ........
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 2012-11-30
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多