Javascript 观察角度

Javascript 观察角度,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,对于AngularJS,我应该如何触发模型现在变脏并且需要保存到服务器?除了用户点击“保存”按钮之外 我曾想过使用$watch,但当数据第一次加载时,它就会启动,所以你最终会遇到这样的攻击: 您还可以$emit事件触发保存,但在以下情况下: 在作用域上设置属性 $emit在该作用域上发出事件 在父控制器中捕获带$on的事件并查看属性 按照这个顺序,在步骤3中声明的事件处理程序将看到在步骤1中进行更改之前的scope属性 我在这里举了一个例子: 如果单击foo,然后单击bar,然后单击foo,

对于AngularJS,我应该如何触发模型现在变脏并且需要保存到服务器?除了用户点击“保存”按钮之外

我曾想过使用$watch,但当数据第一次加载时,它就会启动,所以你最终会遇到这样的攻击:

您还可以$emit事件触发保存,但在以下情况下:

  • 在作用域上设置属性
  • $emit在该作用域上发出事件
  • 在父控制器中捕获带$on的事件并查看属性
  • 按照这个顺序,在步骤3中声明的事件处理程序将看到在步骤1中进行更改之前的scope属性

    我在这里举了一个例子:

    如果单击foo,然后单击bar,然后单击foo,然后单击bar,您将看到事件侦听器总是比属性落后一步

    我假设这与相对于摘要周期处理作用域事件有关,但它似乎违反了javascript的规则。那些有棱角的家伙是怎么做到的,这样当你改变它时,一个属性就不会改变

    当我总是保存旧数据时,这让我有些头疼

    快速修复方法是使用$timeout来“延迟”保存,我假设直到摘要周期结束。虽然这样做有效,但看起来很混乱。这是怎么回事?如果对作用域的更改对事件处理程序不可见,那么事件似乎是无用的,不是吗

    有没有一个干净的方法可以做到这一点


    谢谢。

    这是因为双向绑定在
    $digest
    循环之前不会更新,循环发生在
    $emit
    之后

    我建议对数据使用
    $watch
    来触发保存

    // Controller
    $scope.$watch('message', function(newVal, oldVal) {
      if (newVal === oldVal) {
        return;
      }
      // Handle update...
    });
    
    另一个选项是将对象而不是字符串传递到指令中。通过执行此操作,侦听器上的
    $将能够访问正确的数据

    例如:

    // Controller
    $scope.messageData = {message: "Initial message"};
    
    // HTML
    <div set-message="messageData">...</div>
    
    // Directive
    scope: {
      messageData: "=setMessage"
    },
    link: function(scope) {
      scope.setMessage = function(message) {
        scope.messageData.message = message;
        scope.$emit('messagechange');
      };
    }
    
    //控制器
    $scope.messageData={message:“初始消息”};
    //HTML
    ...
    //指示
    范围:{
    messageData:“=setMessage”
    },
    链接:功能(范围){
    scope.setMessage=函数(消息){
    scope.messageData.message=消息;
    作用域:$emit('messagechange');
    };
    }