10

我使用 ngResource 从我的 api 中提取一些对象,然后将它们显示在表格中。没关系..当我尝试使用 angular-xeditable 使“标签​​”属性可编辑但被视为字符串并且在 angular-xeditable 上没有“ngList”之类的东西时,问题就出现了。我能想到的唯一解决方案是在我的服务上将“tags”属性序列化为“tagsString”,并在调用 $save() 后取消序列化它。有更优雅的解决方案吗?

目的:

{
    "id": "yP8",
    "uploadDate": "2012-10-03T12:52:59-0300",
    "statusChangeDate": "2012-10-03T12:52:59-0300",
    "status": 0,
    "type": 1,
    "mimeType": "JPEG",
    "title": "title-36868",
    "tags": [
        'some-tag',
        'fancy-tag'
    ],
    "language": "en",
    "interactions": {
        "likes": 12371,
        "dislikes": 15,
        "comments": 81
    },
    "published": true
}

控制器:

app.controller( 'ContentsCtrl', function CommentsCtrl( $scope, Contents ) {
    $scope.contents = Contents.query();
});

模板:

<tr ng:repeat="content in contents.content">
    <td>{{content.id}}</td>
    <td ng:click="content.images.showFull=!content.images.showFull">
        <img src="{{content.images.thumbnail.url}}" ng:show="!content.images.showFull">
        <img src="{{content.images.medium.url}}" ng:show="content.images.showFull">
    </td>
    <td>{{content.status}}</td>
    <td>
        <span editable-text="content.title" e-required>{{content.title}}</span>
    </td>
    <td>
        <span editable-text="content.tags">{{content.tags}}</span>
    </td>
    <td>{{content.language}}</td>
</tr>

编辑:

演示(由 Sebastian Gärtner 提供): http ://plnkr.co/edit/ttPNgHXUZKmaJZ9IuB2N?p=preview

4

3 回答 3

2

用另一个指令解决它怎么样。不适用于 xeditable。

喜欢:http ://decipherinc.github.io/angular-tags/

您确实想让标签可编辑吗?你想要什么样的输入机制?

另一个 ng-repeat 标签如何使它们成为单个输入字段,并且可能是添加和删除标签的机制。

于 2013-12-10T02:18:34.103 回答
0

您可以执行以下操作:

<div ng-repeat="tag in content.tags track by $index">
    <span editable-text="content.tags[$index]">{{tag}}</span> 
</div>

诀窍是使用可编辑文本指令连接正确的模型值(在这种情况下使用$index迭代器)。

于 2014-02-14T10:39:58.857 回答
0

angular x-editable 页面上的Editable Table 示例几乎可以实现这一点。通过将列表中的每个字符串包装在一个对象中,您可以对其应用任意属性 - 在这种情况下,您可以在 onCancel 和 onBeforeSave 处理程序中键入保存/删除功能的临时值。

目的:

{
    tags: [
        {name: 'some-tag'},
        {name: 'fancy-tag'}
    ]
};

HTML:

<form editable-form name="tagForm" onBeforeSave="cleanBeforeSave()" onCancel="cleanOnCancel()">
    <ul>
        <li ng-repeat="tag in contents.tags | filter:filterDeleted">
            <span editable-text="tag.name" e-name="name"> {{tag.name}} </span> 
            <button ng-click="deleteTag($index)" ng-show="tagForm.$visible">x</button>
        </li>
    </ul>
    <span ng-show="tagForm.$visible">
        <button type="button" ng-click="addTag()">New</button>
        <button type="submit">Save</button>
        <button type="button" ng-click="tagForm.$cancel()">Cancel</button>

    </span>
    <span ng-hide="tagForm.$visible">
        <button type="button" ng-click="tagForm.$show()">Edit</button>    
    </span>
</form>

控制器:

app.controller( 'TagCtrl', function TagCtrl( $scope, Contents ) {
    $scope.contents = Contents.query();

    $scope.filterDeleted = function(obj) {
        return obj.isDeleted !== true;
    };

    $scope.addTag = function() {
        $scope.contents.tags.push({name:"", isNew:true});
    };

    $scope.removeTag = function(index) {
        $scope.contents.tags[index].isDeleted = true;
    };

    $scope.cleanBeforeSave = function() {
        // go backwards, so deleting doesn't mess up i's count
        for (var i = $scope.contents.tags.length; i--;) {
            var tag = $scope.contents.tags[i];
            if (tag.isDeleted) {
                $scope.contents.tags.splice(i, 1);
            }
            if (tag.isNew) {
                delete tag.isNew;
            }
        }
    };

    $scope.cleanOnCancel = function() {
        // go backwards, so deleting doesn't mess up i's count
        for (var i = $scope.contents.tags.length; i--;) {
            var tag = $scope.contents.tags[i];
            if (tag.isDeleted) {
                delete tag.isDeleted;
            }
            if (tag.isNew) {
                $scope.contents.tags.splice(i,1);
            }
        }
    };
});
于 2014-07-14T17:59:33.323 回答