-1

作为一个angularJS新手,我很困惑我必须绑定到从服务返回的函数来更新视图,而不是数据本身,我找不到任何解释这个的官方文档,有人知道为什么吗?

JSFiddle 代码示例

<div ng-controller="MyCtrl">
binding to a function works!
    <p ng-bind-html-unsafe="tempLog.returnBuffer()"></p>
    <br><br>
       bind to the service variable: Doesn't work, why?
      <p>log={{tempLog.buffer}}</p>
        <br><br>
    bind to scope var instead of service var, still doesn't work
    <p>log={{logBuffer}}</p>
   bind to a scope var which points to the service Function, works!
            <p>log={{pLogFunc()}}</p>
    <button ng-click="addText('more')">Trace</button><br>
</div>

JS代码

var myApp = angular.module('myApp',[]);

myApp.factory('myLog', function() {
    var internalBuffer = "";
    return {
        buffer:internalBuffer,
        trace:function(input){
                internalBuffer = internalBuffer + "<br>" +input;
                buff = input;
            },
        returnBuffer:function(){
            return internalBuffer;
        }
    }
});


function MyCtrl($scope, myLog){
    $scope.tempLog = myLog;
    $scope.logBuffer = myLog.buffer;
    $scope.pLogFunc = myLog.returnBuffer;
    myLog.trace("aaa");

    $scope.addText = function(str){
        myLog.trace(str)
    }

}
4

1 回答 1

0

这不是 AngularJS 绑定问题,这正是 javascript 的工作原理。在您的服务中:

1buffer分配给原始变量internalBuffer

2trace()接受一个改变internalBuffer原语的参数

3returnBuffer()返回internalBuffer原语

由于trace()更改了internalBuffer原语,因此任何绑定buffer都不会影响 中的更改internalBuffer,此外,returnBuffer()返回的值internalBuffer自然而然您对trace()函数所做的更改会影响函数的返回值returnBuffer()

这些建议中的任何一个都可能对您有用:

[1]如果你想从buffer你的服务的属性中绑定myLog,那么将你的trace()函数更改为这样的:

trace:function(input){
  this.buffer = this.buffer + "<br>" +input;
}

[2]您可以忽略该buffer属性并单独使用returnBuffer()if you don't want to expose yourinternalBuffer and only use thetrace() to have access in changing theinternalBuffer`

[3]您可以同时使用两者,该buffer属性提供对另一种缓冲区格式的访问,同时internalBuffer保存所有私有缓冲区/格式/或您可能不想向服务用户公开的任何其他内容。只需确保通过使用来更新buffer您的trace()功能this

于 2014-06-01T01:11:31.947 回答