javascript - Angular JS 将数据从工厂推送到 Controller

标签 javascript html angularjs angularjs-scope angularjs-ng-repeat

我有一个简单的页面,其中有一个输入字段和一个用于更改名称的按钮。 单击按钮时名称会发生​​变化,但我想要发生的是在 hello {{name}} 文本下方,以记录以前选择的名称及其选择时间。 例如

你好汤姆

  • 山姆 - 1414530148463
  • 米克 - 1414530159015

我在这个 fiddle 中尝试了以下操作 http://jsfiddle.net/4ybmyf1a/2/但收到消息“无法读取未定义的属性推送”(我已在 myCtrl 中注释掉,以便 fiddle 可以运行)

    <div ng-controller="MyCtrl">
        <input type="text" ng-model="updatedname" />
        <input type="button" value="Change name" ng-click="changeName(updatedname)"/>
        <br/>
          Hello, {{name}}!

    <ul>
        <li ng-repeat="names in namelog">{{nameLog.value}} - {{nameLog.time}}</li>
    </ul>    
    </div>


    var myApp = angular.module('myApp',[]);
    myApp.factory('UserService', function() {
                var userService = {};
                userService.name = "John";
                userService.ChangeName = function (value) {
                    userService.name = value;
                };
                userService.NameLog  = function (value) {
                    userService.nameLog.push ({
                        "value":value,
                        "time" :Date.now()
                    });
                };
        return userService;
    });

    function MyCtrl($scope, UserService) {
        $scope.name = UserService.name;
        $scope.updatedname="";
        $scope.changeName=function(data){
            $scope.updateServiceName(data);
        }
        $scope.updateServiceName = function(name){
            UserService.ChangeName(name);
            //UserService.NameLog(name);
            $scope.name = UserService.name;
            //$scope.nameLog = UserService.NameLog;
        }
    }

我还考虑添加 userService.nameLog = [] 来阻止未定义的问题,但这并没有像我想要的那样推送项目。

        userService.NameLog  = function (value) {
            userService.nameLog = [];
            userService.nameLog.push ({
                "value":value,
                "time" :Date.now()
            });
        };

我怎样才能实现这个目标?

最佳答案

结合不同的东西。

您的工厂函数 LogName 在推送日志条目时引用自身。这是您想要在服务对象外部声明的事情 (_nameLog) 并使用闭包将其返回 (getNameLog)

myApp.factory('UserService', function() {
        var _nameLog = [];
        var userService = {};
        userService.name = "John";
        userService.ChangeName = function (value) {
            userService.name = value;
        };
        userService.logName  = function (value) {
            _nameLog.push ({
                "value":value,
                "time" :Date.now()
            });
        };
        userService.getNameLog = function(){ return _nameLog; }
        return userService;
});

您还错误地使用了 ng-repeat:

<li ng-repeat="name in nameLog">{{name.value}} - {{name.time}}</li>

这是一个工作版本:http://jsfiddle.net/sfqo2fn3/

关于javascript - Angular JS 将数据从工厂推送到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26618554/

相关文章:

javascript - 可以使用 $parse 或 $eval 来计算 Stingified bool 方程吗?

javascript - 在 GWT 中处理 iron-list 的键盘事件?

javascript - HTML 5 工具

html - CSS 单列布局居中固定宽度 100% 高度带页眉和页脚

java - 使用 Selenium 和 Java 获取链接文本

javascript - 状态更改时 URL 不更新

javascript - Web组件自定义元素传递函数onClick

Javascript 测试 - 使用特定参数调用的函数

javascript - 如何在html5中使用javascript从页面加载的查询字符串中获取值

angularjs - 使用 typescript 类注册时如何访问服务提供商