【问题标题】:Angular - Knockout model sharingAngular - Knockout 模型共享
【发布时间】:2013-10-15 14:47:47
【问题描述】:

我想将 Angular 模型绑定到一个 Knockout 组件。它正在工作 - 当 Angular 模型更改时,将应用 Knockout 绑定。但问题是相反的——我希望 Angular 模型在 Knockout 组件更改时更新,并且在不接触组件的情况下这样做(它一定不知道 Angular 包装器)。 目标 - 使用 Angular 围绕 KO 组件构建快速原型框架,这些组件也在其他环境中使用。因此,KO 组件可以并且应该共享模型(来自 Angular 包装器)。

编辑: 这是一个jsFiddle 示例来展示我想要实现的目标。 这是一种简化,因为在现实世界中,KO 组件将使用内部虚拟机,这将很难被观看。但即使在这里我也不明白为什么 $watch 不起作用。

var sharedData = {
    personName: "alex",
    personAge: "32"
};


function WrapperCtrl($scope){
    $.each(sharedData, function(key, value) {
        sharedData[key] = (typeof value !== "function") ? ko.observable(value) : value;
    });

    $scope.wrapData = sharedData;

    ko.applyBindings(sharedData, document.getElementById("ko_1"));  
    ko.applyBindings(sharedData, document.getElementById("ko_2"));  

    $scope.$watch(
        function () {
            return sharedData.personName();
        }, 
        function(newValue, oldValue) {
            console.log("change");
        }
    );

    $scope.doSomething = function(){
        console.log("before angular function: ", $scope.wrapData.personName(),    $scope.wrapData.personAge())
        sharedData.personName('Bob').personAge(41);
         console.log("after angular function: ", $scope.wrapData.personName(), $scope.wrapData.personAge())
    };
}


function doSomething() {

    console.log("before knockout function", sharedData.personName(), sharedData.personAge())
    sharedData.personName('Mary').personAge(25);
    console.log("after knockout function", sharedData.personName(), sharedData.personAge())
}

【问题讨论】:

标签: angularjs knockout.js data-sharing


【解决方案1】:

如果不允许您直接将 Angular 绑定插入到您的组件中,那么您将无法启动您的摘要循环,因此 Angular 将不知道您的数据源已更新。解决此问题的一种方法是定期调用 $apply,这将使用任何外部更改更新您的模型,如下所示:

    setInterval($scope.$apply, 500);

http://jsfiddle.net/HmcnB/11/

【讨论】:

  • 变量范围呢?如何 $watch KO 组件内的数据?
  • 对不起,我的错误 - 因为你的淘汰赛组件必须与你的 Angular 完全分开 - Angular 无法知道它需要执行一个摘要循环,所以它不会触发你的观察者.处理此问题的一种(稍微粗略的)方法是调用定期 $apply,它将通过更改更新您的范围模型。 jsfiddle.net/HmcnB/11
  • 谢谢,否则听起来真的不可能。 $watch 本身不是执行某种定期检查吗?也许我可以以某种方式处理全局数据,但即便如此,当 sharedData 更改时,我的 $watch 也不会在小提琴中触发。
  • $watch 仅在 Angular 执行其自己的内部摘要循环之一时更新 - 这仅在 Angular 中实际发生某些事情时才会发生。由于您的更改完全在 Angular 外部(即您正在观看的内容不在 $scope 上),因此无法触发。
  • 所以这是一个死锁 - 我正在等待一个摘要周期来知道何时执行一个摘要周期。我现在正在考虑将一些自定义绑定附加到 KO 组件,这会将它们插入 Angular,但不会影响它们的内部结构(如果足够通用,也许可以扩展 KO 组件以支持这一点)。你想更新你的答案以便我接受吗?再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多