将KnularoutJS应用中的AngularJS应用加载为iFrame

时间:2013-11-05 09:23:43

标签: javascript jquery angularjs iframe knockout.js

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

有人能建议我采取更好的方法来实现这个目标吗?

谢谢, BMS

1 个答案:

答案 0 :(得分:2)

实际上,ko可以很好地演奏角度。在这个fiddle中,我们同时将angular和ko应用于同一页面,其中ko控制dom的一部分,而另一个则是angular。他们也可以互相交谈。

唯一特别的东西是自定义绑定,它告诉ko不要控制属于angular的dom分支。使用此方法,您不需要iframe。 但可能你仍然需要改变ko模板。我不太了解角度,所以角度代码可能非常糟糕。

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 - in head,for angular to work:

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