Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Razor 多个tagit和knockout.js_Razor_Knockout.js_Tag It - Fatal编程技术网

Razor 多个tagit和knockout.js

Razor 多个tagit和knockout.js,razor,knockout.js,tag-it,Razor,Knockout.js,Tag It,我试图创建一个页面,用户可以添加多个产品,每个产品可以有多个竞争对手。需要使用tagit生成竞争对手工件。由于某种原因,tagit不起作用。。。 这是淘汰模板: <script type="text/html" id="product-template"> <tr> <td style="width: 5%"> <input type="hidden" name="Products.Index" data-bind="value:

我试图创建一个页面,用户可以添加多个产品,每个产品可以有多个竞争对手。需要使用tagit生成竞争对手工件。由于某种原因,tagit不起作用。。。 这是淘汰模板:

<script type="text/html" id="product-template">
<tr>
    <td style="width: 5%">
        <input type="hidden" name="Products.Index" data-bind="value: Id"/>
    </td>
    <td style="width: 30%">
        Product:<br/>
        <select data-bind='options: ProductSource, optionsText: "Product", optionsCaption: "", value: Product, attr: { name: "Products[" + Id + "].Product" }'></select>
    </td>
    <td style="width: 30%; line-height: 100%; margin-top: 0; padding-top: 0">
        Competitors:<br/>
        <div id="tags_error" style="display: none;" class="ui-state-error-text">entries must be less than 50 characters each</div>
        <ul class="tags" style="margin-top: 2px; padding-top: 0" data-bind="foreach: Competitors">
            <li data-bind="text: $data" >
            </li >
        </ul>
        <div style="font-size: 10px; color: GrayText; font-style: italic;">please separate tags using the comma or enter key</div>
        @* <input type="text" value="" data-bind='attr: { name: "Products[" + $parent.Id + "].Competitors" }' />*@
    </td>
    <td style="width: 30%">
        Positioning:<br/>
        <select data-bind='options: PositioningSource, optionsText: "Positioning", optionsCaption: "", value:Positioning, attr: { name: "Products[" + Id + "].Positioning" }'></select>
    </td>
    <td style="width: 5%">
        <a href="#" data-bind="click: $parent.removeProduct">
            <img src="@Links.Content.Images.DeleteAlert_gif"/>
        </a>
    </td>
</tr>

添加产品效果很好,只是竞争对手显示为一个列表,而不是我可以添加标签的输入…

和解决方案。模板:

<script type="text/html" id="product-template">
<tr>
    <td style="width: 5%">
        <input type="hidden" name="Products.Index" data-bind="value: Id"/>
    </td>
    <td style="width: 30%">
        Product:<br/>
        <select data-bind='options: ProductSource, optionsText: "Product", optionsCaption: "", value:Product'></select>
        <input data-bind='attr: { name: "Products[" + Id + "].Product", value: (Product() !== undefined) ? Product().Product : "" }' type="hidden" value="">
    </td>
    <td style="width: 30%; line-height: 100%; margin-top: 0; padding-top: 0">
        Competitors:<br/>
        <ul style="margin-top: 2px; padding-top: 0" data-bind="tagit:Competitors, productId:$data.Id"></ul>
        <div style="font-size: 10px; color: GrayText; font-style: italic;">please separate competitors using the comma or enter key</div>
    </td>
    <td style="width: 30%">
        Positioning:<br/>
        <select data-bind='options: PositioningSource, optionsText: "Positioning", optionsCaption: "", value:Positioning'></select>
        <input data-bind='attr: { name: "Products[" + Id + "].Positioning", value: (Positioning() !== undefined) ? Positioning().Positioning : "" }' type="hidden" value="">
    </td>
    <td style="width: 5%">
        <a href="#" data-bind="click: $parent.removeProduct">
            <img src="@Links.Content.Images.DeleteAlert_gif"/>
        </a>
    </td>
</tr>

产品:
竞争对手:
    请使用逗号或enter键分隔竞争对手 定位:

    淘汰模式:

    <script type="text/javascript">
    var ProductSource = [];
    var index = 0;
    $.ajax({
        type: "GET",
        url: '@Html.Raw(Url.Action(MVC.UserChoice.ForName()))',
        data: { userChoiceName: '@UserChoiceKey.OpportunityProductInterest' },
        cache: false,
        success: function (data) {
            data.forEach(function (item)
            { ProductSource.push({ Product: item.Text }); });
        }
    });
    
    var PositioningSource = [];
    var index = 0;
    $.ajax({
        type: "GET",
        url: '@Html.Raw(Url.Action(MVC.UserChoice.ForName()))',
        data: { userChoiceName: '@UserChoiceKey.WorkRequestProductPositioning' },
        cache: false,
        success: function (data) {
            data.forEach(function (item)
            { PositioningSource.push({ Positioning: item.Text }); });
        }
    });
    
    $(document).ready(function () {
    
        function ProductItem(id, product, positioning, competitors) {
            var self = this;
            self.Id = id;
            self.Product = ko.observable(product);
            self.Positioning = ko.observable(positioning);
            self.Competitors = ko.observableArray(competitors);
            self.errors = ko.validation.group(self);
        }
    
        function ProductsViewModel() {
            var self = this;
            var id = 0;
            self.Products = [];
            self.Products = ko.observableArray();
    
            @if (Model.Products != null)
            {
                foreach (var item in Model.Products)
                {
                    <text>self.Products.push(new ProductItem(id++, '@item.Product', '@item.Positioning', '@item.Competitors'));</text>
                }
            }
    
            self.selectedProduct = ko.observable();
            self.addProduct = function () {
                self.Products.push(new ProductItem(id++));
            };
            self.removeProduct = function (product) {
                self.Products.remove(product);
            };
        }
    
        ko.bindingHandlers.tagit = {
            //https://github.com/aehlke/tag-it
            init: function (element, valueAccessor, allBindingsAccessor) {
    
                var options = {
                    allowSpaces: true,
                    caseSensitive: false,
                    showAutocompleteOnFocus: true,
                    tagSource: '@Html.Raw(Url.Action(MVC.Marketing.Campaign.SearchTags()))',
                    itemName: "Products[" + allBindingsAccessor.get('productId') + "].Competitors",
                    fieldName:""
                };
    
                var tags = allBindingsAccessor()["tagsSource"];
                if (tags)
                    $.extend(options, {
                        autocomplete: { source: tags, delay: 0, minLength: 0 }
                    });
                $(element).tagit(options);
            },
            update: function (element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                var tags = value;
    
                $(element).tagit("removeAll");
                for (var x = 0; x < tags.length; x++) {
                    $(element).tagit("createTag", tags[x]);
                }
            }
        };
    
        ko.validation.init({ insertMessages: true, decorateElement: true, errorClass: "error" });
        ko.applyBindingsWithValidation(new ProductsViewModel());
    });
    
    
    var ProductSource=[];
    var指数=0;
    $.ajax({
    键入:“获取”,
    url:“@Html.Raw(url.Action(MVC.UserChoice.ForName())”,
    数据:{userChoiceName:'@UserChoiceKey.OpportunityProductInterest'},
    cache:false,
    成功:功能(数据){
    data.forEach(功能(项)
    {ProductSource.push({Product:item.Text});});
    }
    });
    var PositionSource=[];
    var指数=0;
    $.ajax({
    键入:“获取”,
    url:“@Html.Raw(url.Action(MVC.UserChoice.ForName())”,
    数据:{userChoiceName:'@UserChoiceKey.WorkRequestProductPositioning'},
    cache:false,
    成功:功能(数据){
    data.forEach(功能(项)
    {PositioningSource.push({Positioning:item.Text});});
    }
    });
    $(文档).ready(函数(){
    功能ProductItem(id、产品、定位、竞争对手){
    var self=这个;
    self.Id=Id;
    自身产品=可观察的(产品);
    自我定位=可观测(定位);
    自我竞争对手=可观察到的对手;
    self.errors=ko.validation.group(self);
    }
    函数ProductsViewModel(){
    var self=这个;
    var-id=0;
    self.Products=[];
    self.Products=ko.observearray();
    @if(Model.Products!=null)
    {
    foreach(Model.Products中的var项)
    {
    self.Products.push(新的ProductItem(id++、'@item.Product'、'@item.Position'、'@item.Competitors');
    }
    }
    self.selectedProduct=ko.observable();
    self.addProduct=函数(){
    self.Products.push(新产品项(id++));
    };
    self.removeProduct=功能(产品){
    自。产品。移除(产品);
    };
    }
    ko.bindingHandlers.tagit={
    //https://github.com/aehlke/tag-it
    init:function(元素、valueAccessor、allBindingsAccessor){
    变量选项={
    allowSpaces:true,
    区分大小写:错误,
    showAutocompleteOnFocus:正确,
    tagSource:“@Html.Raw(Url.Action(MVC.Marketing.Campaign.SearchTags())”,
    itemName:“产品[“+allBindingsAccessor.get('productId')+“].Competitors”,
    字段名:“
    };
    var tags=allBindingsAccessor()[“tagsSource”];
    如果(标签)
    $.extend(选项{
    自动完成:{source:tags,delay:0,minLength:0}
    });
    $(元素).tagit(选项);
    },
    更新:函数(元素、值访问器){
    var value=ko.utils.unwrapobbservable(valueAccessor());
    var标签=价值;
    $(元素).tagit(“removeAll”);
    对于(var x=0;x

    <script type="text/html" id="product-template">
    <tr>
        <td style="width: 5%">
            <input type="hidden" name="Products.Index" data-bind="value: Id"/>
        </td>
        <td style="width: 30%">
            Product:<br/>
            <select data-bind='options: ProductSource, optionsText: "Product", optionsCaption: "", value:Product'></select>
            <input data-bind='attr: { name: "Products[" + Id + "].Product", value: (Product() !== undefined) ? Product().Product : "" }' type="hidden" value="">
        </td>
        <td style="width: 30%; line-height: 100%; margin-top: 0; padding-top: 0">
            Competitors:<br/>
            <ul style="margin-top: 2px; padding-top: 0" data-bind="tagit:Competitors, productId:$data.Id"></ul>
            <div style="font-size: 10px; color: GrayText; font-style: italic;">please separate competitors using the comma or enter key</div>
        </td>
        <td style="width: 30%">
            Positioning:<br/>
            <select data-bind='options: PositioningSource, optionsText: "Positioning", optionsCaption: "", value:Positioning'></select>
            <input data-bind='attr: { name: "Products[" + Id + "].Positioning", value: (Positioning() !== undefined) ? Positioning().Positioning : "" }' type="hidden" value="">
        </td>
        <td style="width: 5%">
            <a href="#" data-bind="click: $parent.removeProduct">
                <img src="@Links.Content.Images.DeleteAlert_gif"/>
            </a>
        </td>
    </tr>
    
    <script type="text/javascript">
    var ProductSource = [];
    var index = 0;
    $.ajax({
        type: "GET",
        url: '@Html.Raw(Url.Action(MVC.UserChoice.ForName()))',
        data: { userChoiceName: '@UserChoiceKey.OpportunityProductInterest' },
        cache: false,
        success: function (data) {
            data.forEach(function (item)
            { ProductSource.push({ Product: item.Text }); });
        }
    });
    
    var PositioningSource = [];
    var index = 0;
    $.ajax({
        type: "GET",
        url: '@Html.Raw(Url.Action(MVC.UserChoice.ForName()))',
        data: { userChoiceName: '@UserChoiceKey.WorkRequestProductPositioning' },
        cache: false,
        success: function (data) {
            data.forEach(function (item)
            { PositioningSource.push({ Positioning: item.Text }); });
        }
    });
    
    $(document).ready(function () {
    
        function ProductItem(id, product, positioning, competitors) {
            var self = this;
            self.Id = id;
            self.Product = ko.observable(product);
            self.Positioning = ko.observable(positioning);
            self.Competitors = ko.observableArray(competitors);
            self.errors = ko.validation.group(self);
        }
    
        function ProductsViewModel() {
            var self = this;
            var id = 0;
            self.Products = [];
            self.Products = ko.observableArray();
    
            @if (Model.Products != null)
            {
                foreach (var item in Model.Products)
                {
                    <text>self.Products.push(new ProductItem(id++, '@item.Product', '@item.Positioning', '@item.Competitors'));</text>
                }
            }
    
            self.selectedProduct = ko.observable();
            self.addProduct = function () {
                self.Products.push(new ProductItem(id++));
            };
            self.removeProduct = function (product) {
                self.Products.remove(product);
            };
        }
    
        ko.bindingHandlers.tagit = {
            //https://github.com/aehlke/tag-it
            init: function (element, valueAccessor, allBindingsAccessor) {
    
                var options = {
                    allowSpaces: true,
                    caseSensitive: false,
                    showAutocompleteOnFocus: true,
                    tagSource: '@Html.Raw(Url.Action(MVC.Marketing.Campaign.SearchTags()))',
                    itemName: "Products[" + allBindingsAccessor.get('productId') + "].Competitors",
                    fieldName:""
                };
    
                var tags = allBindingsAccessor()["tagsSource"];
                if (tags)
                    $.extend(options, {
                        autocomplete: { source: tags, delay: 0, minLength: 0 }
                    });
                $(element).tagit(options);
            },
            update: function (element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                var tags = value;
    
                $(element).tagit("removeAll");
                for (var x = 0; x < tags.length; x++) {
                    $(element).tagit("createTag", tags[x]);
                }
            }
        };
    
        ko.validation.init({ insertMessages: true, decorateElement: true, errorClass: "error" });
        ko.applyBindingsWithValidation(new ProductsViewModel());
    });