【问题标题】:Loading AngularJS app within KnockoutJS app as iFrame在 KnockoutJS 应用程序中将 AngularJS 应用程序加载为 iFrame
【发布时间】:2013-11-05 09:23:43
【问题描述】:

我需要将已经开发的 AngularJS Web 应用程序展示到另一个使用 KnockoutJS 和 JQuery 开发的 Web 应用程序中。使用纯 KnockoutJS 模板技术开发的父应用程序。我对此进行了一些调查,发现 iFrame 是实现这一目标的一种方法(不知道这是否是正确的方法)。我做了一个原型,我在 iFrame 中加载了 AngularJs 应用程序,它被声明为父应用程序的模板文件。 在原型级别,它工作得很好。但是,我在这里面临一些问题 a) 我必须在所有 Parent 的(KnockoutJS app) 模板文件中声明 iFrame。 b) iFrame 和父网页/应用程序之间的通信(两个应用程序将在同一个域中)看起来有点复杂和不可靠。

有人可以建议我一些更好的方法来实现这一点吗?

谢谢, bms

【问题讨论】:

    标签: javascript jquery angularjs iframe knockout.js


    【解决方案1】:

    实际上,ko 可以很好地与 angular 配合使用。在这个fiddle 中,我们将 angular 和 ko 应用于同一页面,ko 控制 dom 的一部分,而 angular 控制另一个。他们也可以互相交谈。

    唯一特别的是一个自定义绑定,它告诉ko不要控制属于angular的dom分支。使用这种方法,您不需要 iframe。 但可能您仍然需要更改 ko 模板。我不太了解angular,所以angular代码可能很糟糕。

    html:

    <div>
       <div>message for angular:<input type="text" data-bind="value:data"/>
          <button data-bind="click:sendDataToAng">send message to angular</button>
       </div>
       <span data-bind="text:externalMessage"></span>
    </div>
    
    <div data-bind="noControl:{}">
    <div >
    <hr />
    <div>--------------Angular section, everything outside horizontal lines is controlled by ko------------</div>
    <div ng-app="" >
       <div ng-controller="ngvm.Cntl" id="angularContainer" >
          message for ko: <input type="text" ng-model="data" />      
          <button type='button' ng-click="sendToKO()"> send message to ko </button>
          <div ng-bind="externalMessage"></div>
       </div>
    </div>
    <hr />    
        </div>
    </div>
    
        someValue: <input data-bind="value:someValue, valueUpdate:'afterkeydown'" />    
    <div data-bind="text:someValue">
    </div>
    

    js, nowrap -- 在头部,让 Angular 工作:

    var ngvm = {
        Cntl: function($scope) {
            $scope.data = '';
            $scope.sendToKO = function(){            
                console.log($scope.data);
                kovm.externalMessage("message from angular: " + $scope.data);
            }
            $scope.externalMessage = "no extsdfernal messages";
    
    
            $scope.$watch('externalMessage', function(newValue, oldValue) {
                console.log(newValue);
            });        
        }
    }
    
    $(function(){
        var KOCtor = function(){
            var self = this;
            self.externalMessage = ko.observable("no external messages");
            self.data = ko.observable();
            self.sendDataToAng = function(){
            var $scope = angular.element($("#angularContainer")[0]).scope();            
                $scope.$apply(function(){                
                    $scope.externalMessage = "message from ko: " + self.data();
                });    
                $scope.$digest();
            }
    
    
            self.someValue = ko.observable("koko");
        }
    
        ko.bindingHandlers.noControl = {
           init:function(element, valueAccessor, allBindings, viewModel, bindingContext){         
            return { controlsDescendantBindings: true };              
        },
        update:function(element, valueAccessor, allBindings, viewModel, bindingContext){                               
        }        
        }
    
       window.kovm = new KOCtor();    
       ko.applyBindings(window.kovm);
    })
    

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2018-03-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多